我是一本名为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
我不知道为什么这些例子中的输出不同。我知道它的变量范围,但不确切知道原因。我希望有人可以提供帮助。
答案 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
之前此评估的副作用。