代码之家  ›  专栏  ›  技术社区  ›  Saurabh Tiwari

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

  •  0
  • Saurabh Tiwari  · 技术社区  · 6 年前

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

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

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jonas Wilms    6 年前

    你引用的那篇文章完全错了。

    setTimeout变量在全局范围内执行

    1)什么是setTimeout变量?他们的意思是“setTimeout的第一个参数”?

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

    3)某些东西不是“在一个范围内执行的”,范围是由词汇决定的,所以对于某个函数来说,它总是相同的,不管它在哪里和在哪里执行它。

    4)在下面的片段中,他们说它“在全局范围内执行”,因为 this 指向窗口。这与范围无关,这就是背景。

    现在回答你的问题:

    这个函数不应该在全局范围内运行吗?

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

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

    这与块/函数作用域之间的差异有关,请继续阅读 here .