javascript - JavaScript 执行时序中的奇怪行为

标签 javascript runtime scope

我是一本名为 async javascript 的阅读书,这本书的一个例子试图表明当处理器在同一进程中没有指令执行时,javascript 中的事件将被触发。为了证明他的话,他举了一个例子:

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

输出是:

4
4
4
4

一切都很好,我预料到了结果。但是当我将“console.log(i)”置于功能之外时,结果将会改变。

for (var i = 1; i <= 3; i++) {
  setTimeout(console.log(i), 0);
};

输出是:

1
2
3

我不知道为什么这些示例中的输出不同。我知道它是关于变量范围的,但不知道确切的原因。我希望有人能提供帮助。

最佳答案

i don't know why the output is different in those examples

因为在第二种情况下,您正在调用 console.log(i) 立即 并将返回值 undefined 传递给 setTimeout (而不是像第一种情况那样传递函数)。
参数总是先求值,所以如果你有 foo(bar())bar 会先被调用,它的返回值会传递给 foo .

您可以通过在循环后添加 console.log('after'); 来验证这一点。在第一种情况下,你应该得到

after
4
4
4

在第二种情况下,你会得到

1
2
3
after

证明 setTimeout 没有向事件队列添加任何内容。

另见 Calling functions with setTimeout()

i know its about variable scopes

其实不是,是时机,console.log执行的时刻。

关于javascript - JavaScript 执行时序中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25508853/

相关文章:

ios - iPhone 中的运行时类创建

javascript - 基于JavaScript的客户端开发平台

c++ - 作为宏参数的范围内的枚举声明

Javascript 构造函数 : Accessing outside variable

javascript - 函数作用域在 JavaScript 中是如何工作的?

javascript - 如何根据特定的数组组合对数组进行分区?

javascript - 如何计算当前连续天数(从当前日期开始的连续天数)?

javascript - Jquery 自动完成 : How to get the selected items id?

java - 包含多个空格的参数上的 Runtime.exec

javascript - PHP 包含包含相对路径的 html 文件