2017-07-20 60 views
2
未定义
var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this.x); 
    } 
}; 
setTimeout(o.y, 1000); 

节点版本:8.1.3JS的全局变量在setTimeout的

EXCUTE节点main.js --->未定义

但得到的Chrome控制台正确结果1

回答

1

如果你正试图获得全局变量不使用this

var x = 1; 
 
var o = { 
 
    x: 2, 
 
    y: function() { 
 
     console.log(x); 
 
    } 
 
}; 
 
setTimeout(function(){o.y()}, 1000);

否则像这样使用:

var x = 1; 
 
var o = { 
 
    x: 2, 
 
    y: function() { 
 
     console.log(this.x); 
 
    } 
 
}; 
 
setTimeout(function(){o.y()}, 1000);

+1

好的答案,谢谢! – zys

+0

但为什么它在Chrome控制台中工作? – zys

+0

第二个结果是2不是1. – zys

1

我还没有测试过,但这应该工作。我会稍后运行它。

var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this.x); 
    } 
}; 
setTimeout(function(){o.y()}, 1000); 
+0

谢谢,你在o.y丢了“()” – zys

+0

我测试过,结果是2不是1 – zys

2
var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this); 
    } 
}; 
setTimeout(o.y, 1000); 

如果将经由节点运行时,看这个代码的输出,这将是象

Timeout { 
    _called: true, 
    _idleTimeout: 1000, 
    _idlePrev: null, 
    _idleNext: null, 
    _idleStart: 39, 
    _onTimeout: [Function: y], 
    _timerArgs: undefined, 
    _repeat: null } 

正如你可以此在Timeout对象的this对象和值x是没有定义,因此结果undefinedsetTimeout从主线程中获取要执行的函数,并将其放入eventLoop中以稍后执行。传递给eventloop的是函数定义。当在Timeout上下文中执行时,它是未定义的。

让我们在浏览器控制台再次运行此程序

var x = 1; 
var o = { 
    x: 2, 
    y: function() { 
     console.log(this); 
    } 
}; 
setTimeout(o.y, 1000); 

这一次的输出将是Window对象,我们在窗口范围内定义x以及因此this.x输出将1,而不是2

Alexander-Higgins已经提到了正确的方法。

如果您想了解更多关于事件循环的信息,我建议您在事件循环中倾听这个优秀的演讲。 https://www.youtube.com/watch?v=8aGhZQkoFbQ

+0

很好的解释! –