javascript执行时间中的奇怪行为

时间:2014-08-26 14:50:48

标签: javascript runtime scope

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

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

输出是:

4
4
4
4

每个人都可以,我期待结果。但当我把&#34; console.log(i)&#34;没有功能,结果会改变。

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

输出是:

1
2
3

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

2 个答案:

答案 0 :(得分:3)

  

我不知道为什么这些例子中的输出不同

因为在第二种情况下,您立即调用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()

  

我知道它的变量范围

实际上并非如此,这完全取决于时间,console.log被执行的时刻。

答案 1 :(得分:2)

当您致电setTimeout(expr,t)时,expr会被评估,希望它返回一个函数。在您的第二种情况下,console.log(...)不会返回任何内容,但仍会对其进行评估。您看到的是在将结果传递给setTimeout之前此评估的副作用。