setTimout()的延迟参数如何在循环中工作?
我有以下代码,涉及一个for循环内的IIFE(立即调用函数表达式)。 由于打印输出如预期,IIFE功能显然获得了正确的参数。 但我不明白间隔在做什么。 据我所知,第一次迭代的间隔应该是1秒,然后是第二次迭代的2秒等等。
for (var i = 1; i <= 5; i++) {
(function(i){
setTimeout(function timer(){
console.log(i);
}, i*1000);
})(i);
}
我看到i
以1秒5的间隔打印出来。 这让我感到困惑,因为我期待每次迭代都会增加间隔。
使用以下代码:
for (var i = 1; i <= 5; i++) {
(function(i){
setTimeout(function timer(){
console.log(i);
}, 1000);
})(i);
}
我看到所有的价值, i
打印一次间隔后一次。
setTimeout函数中发生了什么,使得它以观察的方式工作?
for
循环运行完成。 它不会等待setTimeout()
调用触发。 因此,当for
循环运行时,它将从现在开始计划setTimeout()
毫秒的setTimeout()
调用。 因此,你看到它们全部相隔一秒钟。
setTimeout函数中发生了什么,使得它以观察的方式工作?
setTimeout()
是一个非阻塞的异步操作。 它计划在将来运行,但围绕它的其他代码将继续运行。 然后,在将来的某个时间,定时器会触发并调用回调。
所以,你的代码基本上是这样的:
setTimeout(fn, 1000);
setTimeout(fn, 2000);
setTimeout(fn, 3000);
setTimeout(fn, 4000);
setTimeout(fn, 5000);
它以非阻塞的方式setTimeout()
运行所有setTimeout()
调用。 每个setTimeout()
函数调用只是在底层系统上注册回调和时间,然后下一行代码继续执行。 然后,在过了适当的时间后,回调被调用。 所以,希望你能看到所有的定时器都计划从现在开始测量他们的时间。 因此,你看到它们每隔1秒就会发射一次。
如果你想要一个异步操作的类比,想象你在你的房子周围走动,你设置了五个闹钟,以便在未来的某个时间开始响铃。 你从现在开始一小时打一个电话,从现在开始打一个小时,从现在开始打两个小时,从现在开始打三个小时,等等......然后,你去做其他事情,做午饭,打扫厨房,修剪草坪等等。 ..和你设置所有时钟一小时后,第一个闹钟响起。 一小时之后,下一个开始响起,等等......你在他们响起之前和之后都会继续做事。 在做其他事情之前,你不必坐下来等待钟声响起。 这就是Javascript异步计时器操作。 您设置它们,然后继续运行其他代码,并在未来的预定时间触发它们。
尝试这个 :
function recursiveTimeout(i) {
setTimeout(function timer(){
console.log(i);
if(i<5) {
recursiveTimeout(i+1);
}
}, 1000 * i);
}
recursiveTimeout(1);
这样下一个setTimeout取决于父定时器的结束。
链接地址: http://www.djcxy.com/p/51601.html上一篇: How does the delay parameter of setTimout() work within a loop?
下一篇: If all JavaScript types are objects, then why are numbers be passed by value?