【问题标题】:Aren't all function in setTimeout executed in global scope?setTimeout 中的所有函数不是在全局范围内执行吗?
【发布时间】:2019-01-08 21:06:50
【问题描述】:

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

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

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

为什么用 let 代替 var 会改变原来的事实?

【问题讨论】:

  • 不,setTimeout 回调不在全局范围内运行,除非您将此与 setTimeout 的函数回调和字符串回调之间的区别混淆了。您是否阅读过let 上的文档并了解var 和let 之间的区别是什么?
  • 你期待什么?
  • 我在这里读到了http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/,上面写着setTimeout Variables are Executed in the Global Scope,如果在window范围内提供x,我希望得到一个值,否则undefined

标签: javascript settimeout let scopes global-scope


【解决方案1】:

你引用的文章是错误的。

setTimeout 变量在全局范围内执行

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

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

3) 某些东西不是“在范围内执行”,范围是由词法确定的,因此对于某个函数来说,它始终是相同的,无论您如何以及在何处执行它都无关紧要。

4) 在下面的 sn-p 中,他们说它“在全局范围内执行”,因为 this 指向 window.这与范围无关,这是上下文。

现在回答你的问题:

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

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

为什么用 let 代替 var 会改变原来的事实?

这与块/函数范围之间的差异有关,请阅读here。

【讨论】:

  • 感谢您的意见,我阅读了更多内容并澄清了事情。但是,根据您的回答和原始文章,是否可以公平地说 setTimeout 中的this 指的是窗口对象。
  • @saurabh 是的,这是正确的,除非您将其绑定到不同的上下文或使用箭头函数
  • 感谢您的澄清。,
猜你喜欢
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 2012-02-18
  • 2015-11-24
  • 1970-01-01
  • 2012-09-08
  • 2021-12-25
  • 2013-07-13
相关资源
最近更新 更多