Javascript setTimeout()工作不正常
这是我的密码Javascript setTimeout()工作不正常,javascript,settimeout,Javascript,Settimeout,这是我的密码 (function() { (function DeleteREG(i) { setTimeout(function() { if (i > 0) { setTimeout(function stop_() { alert(i); }, 2000); setTimeout(function()
(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);
})();
请以书面形式向我解释解决方案。如何解决此问题?当您调用
setTimeout
时,您的代码不会停止
此处定义的这两个功能:
setTimeout(function stop_() {
alert(i);
}, 2000);
setTimeout(function() {
i--;
DeleteREG(i);
}, 800);
它们在同一时刻之后被称为2000
和800
ms。这就是为什么i--
出现在第一次回调的警报之前
“解决方案”可能是将第一个回调链接到第二个回调中:
(function() {
(function DeleteREG(i) {
setTimeout(function() {
if (i > 0) {
setTimeout(function stop_() {
console.log(i);
setTimeout(function() {
i--;
DeleteREG(i);
}, 80);
}, 200);
}
}, 400);
})(5);
})();
传递给2setTimeout
s的函数是在相同的执行范围内创建的(执行函数时会创建一个执行范围),这就是它们共享相同的变量的原因。第二个回调将在第一个回调之前触发,因此会更改i
变量
setTimeout
在经过x毫秒后将消息推入消息队列,x是作为第二个参数经过的时间。无论如何,传递给setTimeout的回调将始终在当前堆栈完成后运行。即使超过0毫秒也会发生这种情况(请阅读更多详细信息)
更新:我不确定你想要达到什么目标,但如果你想从5数到1,可以这样做:
var delay = 1000;
function doStuff (i) {
if ( i > 0 ) {
alert(i);
i -= 1;
setTimeout(function () {
doStuff(i);
}, delay);
}
}
doStuff(5);
如果您没有在chrome上使用节流选项,请查看。它可以模拟一个缓慢的设备,改变时间间隔。第二个超时将在第一个超时之前运行,因此在调用alert
之前,i
将被递减。谢谢你的回复。你能写下修改后的代码吗?有没有任何书籍或网站可以教我这方面的知识?实际上我对这门语言不熟悉。所以,你能推荐一些书或网站吗?请回复。如果我有疑问想联系你,那我怎么联系你?@Satya这可能是JS的最好文档:+1对于MDN文档,我推荐的一本书是Nicholas C.Zakas的《面向Web开发人员的专业JavaScript》,当然还有播放列表,谢谢你和你的建议。非常感谢你的解释。太好了。没问题,请按照我提供的链接。它将帮助您更好地理解事件循环机制,这是使用JS时需要掌握的基本概念之一。可悲的是,大多数人都懒得学这种语言,最终他们的代码看起来非常混乱。好的。我一定会按照这个链接。谢谢