gpt4 book ai didi

JavaScript - setTimeout()/clearTimeout()

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:48 27 4
gpt4 key购买 nike

为什么这个函数打印出 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 会(同步)重新分配多次并最终成为 < em>最终 setTimeout。因此,每次超时函数运行时,它都会引用相同的 tc,该 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 具有 block 作用域,并且未提升)给每个迭代一个单独的 tc 绑定(bind):

(function fn1() {
for (let i = 0; i < 4; i++) {
let tc = setTimeout(function(i) {
console.log(i);
clearTimeout(tc);
}, 10, i);
}
})();

关于JavaScript - setTimeout()/clearTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421550/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com