所以我尝试在线研究此问题,但似乎找不到答案。为什么setTimeout(几乎)总是指向Global / window对象?或setTimeout指向哪个对象?setTimeout自身及其外部Reference中还具有哪种范围?
for(let i = 0 ; i<3 ; i++){
setTimeout(function(){
console.log(i)
}
}
此代码的输出是
// 0
// 1
// 2
我得到让let具有块范围,并为每个块内的每次迭代创建i值的引用。但是,如果setTimeout指向全局/窗口对象,则不应引用外部环境。
Closures/Scope and the setTimeout for loop question
本文介绍-闭包(也就是我们传递给setTimeout的回调)保留对创建它们的环境/作用域的引用,包括对其变量的引用,即使该环境/作用域停止运行也是如此。哦突然,这变得更加有意义。即使在我们的主代码完成之后,仍然保留对其变量的引用(至少是闭包使用的变量)以供闭包访问。因此,如果我们在回调中使用的i是该环境中的全局变量,则闭包将使用该引用。