[英]JavaScript - setTimeout() / clearTimeout()
为什么这个功能打印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);
}
})();
当然, 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); } })();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.