JavaScript - setTimeout()/ clearTimeout()

时间:2018-05-19 03:43:20

标签: javascript

为什么此功能打印出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);
    }
})();

1 个答案:

答案 0 :(得分:5)

var当然会被提升,所以在for循环中tc获取(同步)多次重新分配并最终成为 final {{ 1}}。因此,每次超时函数运行时,它都会引用引用最终迭代超时的相同setTimeout,并使用tc清除它。对于口译员来说,它看起来像这样:

&#13;
&#13;
clearTimeout
&#13;
&#13;
&#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 3let具有块范围,并且不会被提升)为每个迭代提供let的单独绑定:

&#13;
&#13;
tc
&#13;
&#13;
&#13;