带定时事件的JavaScript递归(setTimeout)

时间:2012-01-02 06:31:51

标签: javascript recursion timer settimeout pass-by-value

我正在尝试使用JavaScript构建计时器。这是我的功能:

var t;
function time(num){
    var buf = num;
    document.getElementById("test").innerHTML=buf;
    buf++;
    alert(buf + " " + num); //For troubleshooting
    t=setTimeout("time(buf)",1000);
}

如果我运行时间(0),ID =“test”的部分没有任何反应。每次调用函数时, num 始终等于0且 buf 始终等于1(来自警报函数)。

我对Java和C很满意,我知道这可以用这些语言工作。我知道JavaScript也是一种按值传递的语言,为什么这个计时器不起作用呢?

另外,为什么我尝试时没有发生任何事情(并将所有 buf 更改为 num

t=setTimeout("time(num)",1000);

我知道还有其他方法可以创建计时器,但我想知道为什么这个方法不起作用。感谢。

2 个答案:

答案 0 :(得分:4)

避免将字符串传递给setTimeout。当你这样做时,字符串或多或少被执行为eval,由于许多原因这是邪恶的。有关详细信息,请参阅this question

相反,请考虑将匿名函数传递给setTimeout。这将使解决您的问题变得微不足道:

t = setTimeout(function() { time(buf); }, 1000);

答案 1 :(得分:2)

当您将字符串传递给setTimeout时,会在时间到来时对其进行评估。在这种情况下,当时间到来时,不再有buf变量,代码会抛出错误。

您应该自己替换该值。

t = setTimeout("time(" + buf + ")",1000);

或者,更好的是,传递函数而不是字符串

t = setTimeout(function() {
  time(buf);
}, 1000);