繁体   English   中英

JavaScript - setTimeout()/ clearTimeout()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM