为什么以下每1秒记录一次?我将1000毫秒乘以增量。我的日志不应该在1秒后显示,然后是2秒,然后是3秒?
for (var i = 0; i < 5; i++) {
(function(r) {
setTimeout(
function() {
console.log(r)
}
, r * 1000 );
})(i)
}
答案 0 :(得分:4)
它正常工作,基本上,循环用作写这个的简写:
setTimeout( function(){ console.log(0) }, 1000)
setTimeout( function(){ console.log(1) }, 2000)
setTimeout( function(){ console.log(2) }, 3000)
setTimeout( function(){ console.log(3) }, 4000)
setTimeout( function(){ console.log(4) }, 5000)
因此,每个人都会一个接一个地看起来像这样:
▀
▀▀
▀▀▀
▀▀▀▀
▀▀▀▀▀
您可能正在寻找的是
(function newTimeout( seconds ){
if( seconds > 4 ) return;
console.log(seconds);
setTimeout( function(){
newTimeout( seconds + 1 )
}, seconds * 1000);
})(0);
有点像这样
▀
▀▀
▀▀▀
▀▀▀▀
▀▀▀▀▀
希望它有所帮助!
答案 1 :(得分:3)
你的循环兄弟实际上没有任何问题。会发生什么是同时执行setTimeout执行。请记住,您的小循环执行时间只需几毫秒。
概念验证。
for (var i = 0; i < 5; i++) {
console.log(new Date() + " Loop Executed: " + (i + 1));
(function (r) {
setTimeout(
function () {
console.log(new Date() + " " + r)
}
, (r * 1000));
})(i)
}
答案 2 :(得分:2)
为什么每1秒记录一次以下内容?
因为第一个记录在0 x 1000ms之后,第二个记录在1 x 1000ms之后,第三个记录在2 x 1000ms之后...所以,在0,1,2,3,4秒之后
我的日志不应该在1秒后显示,然后是2秒,然后是3秒?
实际上在0,1,2,3和4秒之后 - 但它不是累积的,你几乎在同一时间开始所有的超时
答案 3 :(得分:2)
那是因为调用setTimeout
不会停止执行代码。循环将继续并从头开始执行每个循环中的所有setTimeout()
。这就是它每秒记录的原因。它们会在1,2,3和4秒后熄灭,但同时启动。