setTimeout 在循环中,它的行为与预期不同
setTimeout in a loop, it behaves different than expected
本文关键字:循环 setTimeout 更新时间:2023-09-26
所以我知道setTimeout()函数可以在一段时间后触发传入的函数,但它在循环中的行为似乎有所不同。例如:
for (var i = 0; i < 5; i++) {
setTimeout(console.log(i + ', time is: ' + new Date()), 1000);
}
控制台.log() 似乎同时打印出所有数字。我不明白为什么。你们中的一些人可以解释为什么setTimeout()
在这个循环中不起作用吗?
您没有将console.log
传递给setTimeout
,而是立即调用它。
此外,您需要将i
置于关闭状态,否则所有调用都将记录5
。
试试这个:
function makelogger(i) {
return function () {
console.log(i + ', time is: ' + new Date());
}
}
for (var i = 0; i < 5; i++) {
setTimeout(makelogger(i), 1000); // or i*1000
}
如果你想每秒执行控制台功能,你需要做一些不同的事情。
for (var i = 1; i <= 5; i++)
{
setTimeout( function()
{
document.write(new Date() + "<br />");
}, (i * 1000));
}
这将以 1 秒的间隔显示时间,总共 5 次。
在你的setTimeout
中,第一个参数应该返回一个稍后将执行的函数。因此,您需要一个表达式,该表达式将是函数调用,而不是函数调用本身。
尝试,作为一个粗略的例子:(ttl
是活:)的考验
function makelogger(ttl) {
var msg = ttl + ', time is: ' + new Date();
console.log(msg);
if ( ttl > 0 ) {
setTimeout(function(){return makelogger(ttl-1)}, 1000);
}
}
makelogger(5)
这是完整的 MDN 描述
问题的解决方案是将函数包装到闭包中:
for (var i = 1; i <= 5; i++)
{
(function(j)
{
setTimeout(function()
{
document.write(j + " - " + new Date() + "<br />");
}, (j * 1000));
})(i);
}
您可以链接您的设置超时:
setTimeout(function() {
console.log(1 + ', time is: ' + new Date())
setTimeout(function() {
console.log(2 + ', time is: ' + new Date())
}, 1000);
}, 1000);
或者你可以使用一个函数来让它变得更好:
times = 5;
timeout(times);
function timeout(times) {
setTimeout(function(){
console.log(times + ', time is: ' + new Date())
if(times > 1) {
setTimeout(timeout(times-1), 1000);
}
},1000)
}
相关文章:
- JS-我的循环使用setTimeout停止循环
- javascript:在for循环中使用settimeout来定期显示文本
- 如何让 setTimeout 函数运行,然后停止使用循环
- nodejs-settimeout是否在不同的循环中共享变量
- 在for循环中使用setTimeout失败
- 为什么javascript setTimeout()不能在循环中工作
- 如何将setTimeout与“;当“;循环
- 而循环调用setTimeout不起作用
- for循环中嵌套if条件的setTimeout
- Javascript:setTimeout,用于循环和回调函数
- 在循环中调用 setTimeout 未按预期工作
- Jquery 每个循环都无法提取值,除非使用 setTimeout
- 使用 setTimeout() 循环,使矩形变大,直到它到达画布边缘,然后重置
- 我可以在 for 循环中设置多个 window.setTimeout 事件吗?
- Firefox setTimeout + jQuery 淡入淡出循环不一致,提前停止,不会循环
- 为什么我的循环在迭代之间没有等待?setTimeout()
- setTimeout 会创建一个无限循环
- setTimeout 在循环中,它的行为与预期不同
- 循环中 setTimeout 的 Jquery 用法
- 我想循环setTimeout()函数后,每22秒