为什么此功能打印出0 1 2
而不是0 1 2 3
?
(function fn1(){
for (var i = 0; i < 4; i++) {
var tc=setTimeout(function(i){
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();
答案 0 :(得分:5)
var
当然会被提升,所以在for
循环中tc
获取(同步)多次重新分配并最终成为 final {{ 1}}。因此,每次超时函数运行时,它都会引用引用最终迭代超时的相同setTimeout
,并使用tc
清除它。对于口译员来说,它看起来像这样:
clearTimeout
&#13;
如果您要打印(function fn1() {
var tc;
var i;
for (i = 0; i < 4; i++) {
tc = setTimeout(function(i) {
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();
,请改为使用0 1 2 3
(let
具有块范围,并且不会被提升)为每个迭代提供let
的单独绑定:
tc
&#13;