JS Global变量在setTimeout中未定义

时间:2017-07-20 02:51:47

标签: javascript node.js

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

3 个答案:

答案 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未定义,因此结果为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而不是{{ 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);