function printSeries() {
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, 3000);
}
console.log('printing');
}
printSeries();
为什么它打印的值是i的10倍?堆栈为空后,将调用SetTimeout回调函数。它是否在中存储了一个词法范围
当脚本第一次到达setTimeout
时,它会在3秒钟后将您的函数添加到要执行的队列中,然后立即继续循环。
当3秒钟过去时,循环已经完成很久了(一个简单循环的10次迭代不需要3秒钟(,这就是为什么您可以这么早看到'printing'
消息的原因。
此时,i
是10
,因此10
被打印10次(因为这是函数已添加到队列的次数。Javascript使用i
的当前值,而不是函数首次添加到队列时i
的值。
以下是脚本的修订版本,在将函数添加到队列时使用i
的值:
function printSeries() {
for (var i = 0; i < 10; i++) {
setTimeout((function(i) {
return function() {
console.log(i);
}
}(i)), 3000);
}
console.log('printing');
}
printSeries();
这里,i
的值绑定到函数,而不仅仅是引用。