为什么当我使用 setTimeout 方法时变量不保留?
Why doesn't the variable stay when I am using the setTimeout method?
var obj = {
id: 1,
getId: function(){
console.log(this.id)
}
}
obj.getId(); // 1
setTimeout(obj.getId, 1000); // undefined
所以我试图了解直接调用该方法效果很好,但是当我使用 setTimeout 方法调用它时,范围不知何故消失了。这是为什么?这是语言的缺陷还是我不完全理解的幕后发生的其他事情。
我什至在 getId
方法中尝试了 var self = this;
,但它仍然会说 self.id
未定义。这是怎么回事?
PS: 我正在使用节点 v6.5.0 运行 这段代码通过。
以这种方式传递函数引用时,您将丢失 ThisBinding(函数内部 this
的值)。
相反,传递 obj.getId.bind(obj)
。
setTimeout(obj.getId.bind(obj), 1000);
把它想象成内存中有一堆函数,如果你用 obj.getId()
调用一个函数,你就是在告诉它传递 obj
作为它的 ThisBinding。
但是,如果你简单地传递 obj.getId
,你只是给它一个对某个函数的函数引用,它不知道它应该使用哪个对象作为上下文(所以它将默认为全局对象)。使用 Function.prototype.bind()
可以 锁定 您选择的 ThisBinding。
var obj = {
id: 1,
getId: function(){
console.log(this.id)
}
}
obj.getId(); // 1
setTimeout(obj.getId, 1000); // undefined
所以我试图了解直接调用该方法效果很好,但是当我使用 setTimeout 方法调用它时,范围不知何故消失了。这是为什么?这是语言的缺陷还是我不完全理解的幕后发生的其他事情。
我什至在 getId
方法中尝试了 var self = this;
,但它仍然会说 self.id
未定义。这是怎么回事?
PS: 我正在使用节点 v6.5.0 运行 这段代码通过。
以这种方式传递函数引用时,您将丢失 ThisBinding(函数内部 this
的值)。
相反,传递 obj.getId.bind(obj)
。
setTimeout(obj.getId.bind(obj), 1000);
把它想象成内存中有一堆函数,如果你用 obj.getId()
调用一个函数,你就是在告诉它传递 obj
作为它的 ThisBinding。
但是,如果你简单地传递 obj.getId
,你只是给它一个对某个函数的函数引用,它不知道它应该使用哪个对象作为上下文(所以它将默认为全局对象)。使用 Function.prototype.bind()
可以 锁定 您选择的 ThisBinding。