setTimeout()无法正常工作

时间:2014-10-04 17:03:50

标签: javascript settimeout

这是我的代码

(function() {
    (function DeleteREG(i) {
        setTimeout(function() {
            if (i > 0) {
                setTimeout(function stop_() {
                    alert(i);
                }, 2000);
                setTimeout(function() {
                    i--;
                    DeleteREG(i);
                }, 800);
            }
        }, 4000);
    })(5);
})();

根据代码,它应该在i=5,4,3,2,1发出警告。但它会在i=4,3,2,1,0发出警告。有人可以解释一下为什么它不起作用吗?应该纠正哪些代码才能正常工作?相同以下代码也会发生的事情

(function() {
    (function DeleteREG(i) {
        setTimeout(function() {
            if (i > 0) {
                setTimeout(function stop_() {
                    alert(i);
                }, 2000);

                    i--;
                    DeleteREG(i);
            }
        }, 4000);
    })(5);
})();

请以书面形式向我解释解决方案。如何摆脱这个问题?

3 个答案:

答案 0 :(得分:0)

当您致电setTimeout时,您的代码不会停止。

这里定义的两个函数:

            setTimeout(function stop_() {
                alert(i);
            }, 2000);
            setTimeout(function() {
                i--;
                DeleteREG(i);
            }, 800);

他们在同一时间之后调用2000800 ms。这就是为什么i--出现在第一次回调的alert之前。

A"解决方案"可能是在第二个回调中链接第一个回调:

(function() {
    (function DeleteREG(i) {
        setTimeout(function() {
            if (i > 0) {
                setTimeout(function stop_() {
                    console.log(i);
                    setTimeout(function() {
                      i--;
                      DeleteREG(i);
                  }, 80);
                }, 200);

            }
        }, 400);
    })(5);
})();

答案 1 :(得分:0)

传递给2 setTimeout的函数在同一执行范围内创建(执行函数时创建执行范围),这就是他们共享相同 {的原因。 {1}}变量。第二个回调将在第一个回调之前触发,因此改变i变量。

经过x毫秒后,

i将消息推送到消息队列中,x是您作为第二个参数传递的时间。无论如何,传递给setTimeout的回调将始终在当前堆栈完成后运行。即使您传递0毫秒也会发生这种情况(请阅读更多详细信息here)。

更新:我不确定你想要达到什么目标,但如果你想从5点算到1点,那就可以了:

setTimeout

答案 2 :(得分:0)

检查您是否在chrome上使用限制选项。它可以模拟慢速设备,改变间隔时间。