var x = 1;
var o = {
x: 2,
y: function () {
console.log(this.x);
}
};
setTimeout(o.y, 1000);
节点版本:8.1.3
Excute node main.js --->的未定义
但是在Chrome控制台中获得正确的结果1
答案 0 :(得分: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 }
尽管如此,this
对象中的Timeout
对象和值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
而不是{{ 1}}。
Alexander-Higgins已经提到了正确的方法。
如果您想了解有关事件循环的更多信息,我建议您在事件循环中听取这个优秀的演讲。 https://www.youtube.com/watch?v=8aGhZQkoFbQ
答案 1 :(得分:1)
我没有测试过,但这应该有效。我稍后会运行它。
var x = 1;
var o = {
x: 2,
y: function () {
console.log(this.x);
}
};
setTimeout(function(){o.y()}, 1000);
答案 2 :(得分: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);