【发布时间】:2018-03-06 23:09:27
【问题描述】:
我刚刚阅读了 You Don't Know Javascript 系列的“范围和闭包”一书。这本书有一个附录谈论这个词汇。它给出了 this 如何失去其绑定以及如何使用箭头函数解决的示例。
我对第一种情况的示例有疑问。这是本书的例子:
var obj = { id: 2, cool: function(){console.log(this.id)}}
id=3;
obj.cool();
setTimeout(obj.cool, 100);
这可以很好地打印预期结果:第一次为 2,在 setTimeout 调用中为 3。
但如果我通过以下方式更改此调用:
var obj = { id: 2, cool: function(){console.log(this.id)}}
id=3;
obj.cool();
setTimeout(function(){obj.cool()}, 100);
两次都打印 2。
我的猜测是,通过将对 obj.cool 的调用包含在一个函数中,我正在创建一个 id 具有预期值的范围。
我说的对吗?这是正确的解释吗?我错过了什么吗?
【问题讨论】:
-
不,您没有创建一个带有额外
id的范围。您现在只需在新函数中调用obj上的obj.cool。 -
您能否进一步解释为什么
2和3是第一个示例中的预期结果?我想您对此的理解也存在一些缺陷。 -
@Bergi 你可以在这里找到解释:github.com/getify/You-Dont-Know-JS/blob/master/…
-
obj.cool();使用obj的上下文调用cool函数。obj.cool仅将函数传递给setTimeout,而没有obj的上下文。当它被调用时,它不再与obj关联,它只是一个普通函数,因此它不知道将obj用作this。
标签: javascript this lexical-scope