当我使用setTimeout方法时,为什么变量不会停留?

时间:2016-09-20 13:29:08

标签: javascript scopes lexical-scope

var obj = {
    id: 1,
    getId: function(){
        console.log(this.id)
    }
}

obj.getId(); // 1

setTimeout(obj.getId, 1000); // undefined

所以我试图理解直接调用该方法做得很好但是当我使用setTimeout方法调用它时,范围不知何故消失了。这是为什么?这是语言中的缺陷,还是幕后还有其他不完全理解的事情。

我甚至在var self = this;方法中尝试getId,但仍然会说self.id未定义。发生了什么事?

PS:我正在使用node v6.5.0来运行此代码。

1 个答案:

答案 0 :(得分:1)

当以这种方式传递函数引用时,你正在丢失ThisBinding(函数内部this的值)。

相反,传递obj.getId.bind(obj)

setTimeout(obj.getId.bind(obj), 1000); 

想想它就像内存中有很多函数一样,如果你用obj.getId()调用一个函数,你就告诉它将 obj 作为它的ThisBinding传递

但是,如果你简单地传递obj.getId,你只是给它一个函数的函数引用,并且它不知道它应该用作哪个对象作为上下文(因此它将默认为全局对象) )。使用Function.prototype.bind()可以锁定您选择的ThisBinding。