setTimeout 中的所有函数不都是在全局范围内执行的吗?

Aren't all function in setTimeout executed in global scope?

我以为setTimeout中的所有函数都是在全局范围内执行的。然后我今天看到了这个:

 for(let x = 0; x < items.length; x++){
          setTimeout(function() {
                console.log(x);
          })
 }

即使 x 的值在全局 scope/window 范围内;此代码控制台从 0 到 9。我在这里缺少什么。这个函数不应该在全局范围内 运行 吗?

为什么使用 let 而不是 var 改变了以前的事实?

你引用的文章是错误的。

setTimeout Variables are Executed in the Global Scope

1) 什么是 setTimeout 变量?他们的意思是 "first argument of setTimeout" 吗?

2)变量无法执行。它们的值可以被执行(如果是函数的话)

3) Something is not "executed in a scope", scope 是词法决定的,所以对于某个函数,它总是相同的,不管你如何以及在哪里执行它。

4) 在下面的代码片段中,他们说它是 "executed in the global scope",因为 this 指向 window。这与范围无关,那是上下文。

现在回答您的问题:

Isn't this function supposed to run in global scope?

不,它在 for 循环的块范围内运行,因为它是该块的 "inside"。

How come using let instead of var changes the former fact ?

这与块/函数范围之间的区别有关,请继续阅读here