为什么setitimeout函数在函数调用结束后仍然是i的访问值



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'消息的原因。

此时,i10,因此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的值绑定到函数,而不仅仅是引用。

相关内容

最新更新