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
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
如果你正试图获得全局变量不使用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);
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
是没有定义,因此结果undefined
。 setTimeout
从主线程中获取要执行的函数,并将其放入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
很好的解释! –
好的答案,谢谢! – zys
但为什么它在Chrome控制台中工作? – zys
第二个结果是2不是1. – zys