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来运行此代码。
答案 0 :(得分:1)
当以这种方式传递函数引用时,你正在丢失ThisBinding(函数内部this
的值)。
相反,传递obj.getId.bind(obj)
。
setTimeout(obj.getId.bind(obj), 1000);
想想它就像内存中有很多函数一样,如果你用obj.getId()
调用一个函数,你就告诉它将 obj
作为它的ThisBinding传递
但是,如果你简单地传递obj.getId
,你只是给它一个函数的函数引用,并且它不知道它应该用作哪个对象作为上下文(因此它将默认为全局对象) )。使用Function.prototype.bind()
可以锁定您选择的ThisBinding。