一、同步异步与变量作用域
以下输出什么?
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(new Date().toLocaleTimeString(), 'hello', i);
}, 1000);
}
console.log(new Date().toLocaleTimeString(), 'word', i);
正确答案:
17:05:42 word 3
17:05:43 hello 3
17:05:43 hello 3
17:05:43 hello 3
原因:
循环后,设置了 3 个定时器,他们在 1 s 后触发。而循环后,其后的代码是立即执行。
因为 i 是全局变量, 循环后,包括 1 s 后都变为了 3。
优化:
① 想输出以下效果:
17:05:42 word 3
17:05:43 hello 0
17:05:43 hello 1
17:05:43 hello 2
1、利用 setTimeout API
for (var i = 0; i < 3; i++) {
setTimeout(function(j) {
console.log(new Date().toLocaleTimeString(), 'hello', j);
}, 1000, i); // 设置了 j = i
}
console.log(new Date().toLocaleTimeString()