为什么setTimeout总是指向Global Scope? [关闭]

问题描述 投票:-1回答:1

所以我尝试在线研究此问题,但似乎找不到答案。为什么setTimeout(几乎)总是指向Global / window对象?或setTimeout指向哪个对象?setTimeout自身及其外部Reference中还具有哪种范围?

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

此代码的输出是

// 0

// 1

// 2

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

javascript ecmascript-6 settimeout
1个回答
0
投票

Closures/Scope and the setTimeout for loop question

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

© www.soinside.com 2019 - 2024. All rights reserved.