Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setTimeout()工作不正常_Javascript_Settimeout - Fatal编程技术网

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);
})();

传递给2
setTimeout
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时需要掌握的基本概念之一。可悲的是,大多数人都懒得学这种语言,最终他们的代码看起来非常混乱。好的。我一定会按照这个链接。谢谢