一个用来测试“你是否理解JS”的测试是这样的:
for (var i = 1; i <= 3; i++) {
setTimeout(function() { console.log(i); }, 0);
}
结果是
4
4
4
点解? 因为setTimeout是个异步函数,就算timeout设置为0--setTimeout里的函数也只能在for循环结束后才能运行。当for循环结束后,i就成了4. 而setTimeout里面的函数就是用把这个i打印出来,结果当然就是打印3个4了。
为了传递i的每个值,你不得不把for循环里的语句封转在一个函数中,然后把i传递给它 (这就是JS里有名的技巧:匿名函数wrapper了):
for (var i = 1; i <= 3; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 0);
})(i);
}