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

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

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

1
2
3
4
5
 for(let x = 0; x < items.length; x++){
          setTimeout(function() {
                console.log(x);
          })
 }

即使在全局作用域/窗口作用域中有x的值,此代码也可以从0控制台到9控制台。我这里缺少什么。这个函数不应该在全局范围内运行吗?

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


你引用的那篇文章是错的。

setTimeout Variables are Executed in the Global Scope

1)什么是setTimeout变量?他们的意思是"第一个设定时间的争论"?

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

3)某个东西不是"在作用域中执行的",作用域是通过词法来确定的,因此对于某个函数来说,它总是相同的,无论您如何以及在何处执行它都不重要。

4)在下面的代码片段中,他们说它"在全局范围内执行",因为this指向窗口。这与范围无关,这就是上下文。

现在回答你的问题:

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

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

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

这与块/函数作用域之间的区别有关,请阅读这里。