所以我知道setTimeout()函数可以在一段时间后触发传入的函数,但它在循环中看起来表现不同。例如:
for (var i = 0; i < 5; i++) {
setTimeout(console.log(i + ', time is: ' + new Date()), 1000);
}
console.log()似乎同时打印出所有数字。我不懂为什么。你们有些人可以解释为什么setTimeout()
在这个循环中不起作用吗?
答案 0 :(得分:2)
您未将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
}
答案 1 :(得分:0)
如果你想每秒执行一次控制台功能,你需要做一些不同的事情。
for (var i = 1; i <= 5; i++)
{
setTimeout( function()
{
document.write(new Date() + "<br />");
}, (i * 1000));
}
&#13;
这将以1秒的间隔显示时间,总共5次。
答案 2 :(得分:0)
在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)
Here是完整的MDN说明
答案 3 :(得分:0)
解决问题的方法是将函数包装到闭包中:
for (var i = 1; i <= 5; i++)
{
(function(j)
{
setTimeout(function()
{
document.write(j + " - " + new Date() + "<br />");
}, (j * 1000));
})(i);
}
&#13;
答案 4 :(得分:-1)
您可以链接setTimeouts:
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)
}