我正在尝试使用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);
我知道还有其他方法可以创建计时器,但我想知道为什么这个方法不起作用。感谢。
答案 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);