为什么这个函数输出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);
}
})();发布于 2018-05-19 03:51:27
当然,var会被挂起,因此在for循环中,tc得到(同步)多次重新分配,并作为最终的setTimeout结束。因此,每次超时函数运行时,它都引用引用最后迭代超时的同一个tc,并使用clearTimeout清除它。在解释器看来,如下所示:
(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的单独绑定。
(function fn1() {
for (let i = 0; i < 4; i++) {
let tc = setTimeout(function(i) {
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();
https://stackoverflow.com/questions/50421550
复制相似问题