为什么当我使用 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。