这是我的代码
(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);
})();
请以书面形式向我解释解决方案。如何摆脱这个问题?
答案 0 :(得分:0)
当您致电setTimeout
时,您的代码不会停止。
这里定义的两个函数:
setTimeout(function stop_() {
alert(i);
}, 2000);
setTimeout(function() {
i--;
DeleteREG(i);
}, 800);
他们在同一时间之后调用2000
和800
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
变量。
i
将消息推送到消息队列中,x是您作为第二个参数传递的时间。无论如何,传递给setTimeout的回调将始终在当前堆栈完成后运行。即使您传递0毫秒也会发生这种情况(请阅读更多详细信息here)。
更新:我不确定你想要达到什么目标,但如果你想从5点算到1点,那就可以了:
setTimeout
答案 2 :(得分:0)
检查您是否在chrome上使用限制选项。它可以模拟慢速设备,改变间隔时间。