所以我尝试在线研究这个问题,但是我似乎无法找到答案。 为什么setTimeout(几乎)总是指向Global范围? 或setTimeout指向哪个范围?
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是该环境中的全局变量,则闭包将使用该引用。