为什么setTimeout总是指向Global Scope?

所以我尝试在线研究这个问题,但是我似乎无法找到答案。 为什么setTimeout(几乎)总是指向Global范围? 或setTimeout指向哪个范围?

for(let i = 0 ; i<3 ; i++){
    setTimeout(function(){
        console.log(i)
    }
}

该代码的输出是

// 0

// 1

// 2

我得到let具有块作用域,并为每个块内的每次迭代创建i值的引用。 但是,如果setTimeout指向全局作用域,则不应引用外部环境。

评论
cxq257990
cxq257990

Closures/Scope and the setTimeout for loop question

文章解释了-闭包(也就是我们传递给setTimeout的回调)保留对创建它们的环境/作用域的引用,包括对其变量的引用,即使该环境/作用域停止运行也是如此。哦突然,这变得更加有意义。即使在我们的主代码完成之后,仍然保留对其变量的引用(至少是闭包使用的变量)以供闭包访问。因此,如果在回调中使用的i是该环境中的全局变量,则闭包将使用该引用。

点赞
评论