var until = $("#time").html();
function updateTime() {
$("#time").html(
date("d", until) + " day(s)<br />" +
date("h", until) + " hour(s)<br />" +
date("i", until) + " minute(s)<br />" +
date("s", until) + " second(s)"
);
}
setInterval("updateTime(until)",1000);
每次我运行此操作时,都会收到此错误:
未捕获的ReferenceError:直到未定义 (匿名函数)
我看不出什么错。我试图谷歌很多,但我找到的每一页都说setInterval()
是对的。
答案 0 :(得分:16)
瓶盖:
setInterval(function() {updateTime(until); }, 1000);
答案 1 :(得分:5)
问题是您将代码作为字符串传递给setInterval
。这意味着它在全球范围内进行评估。变量until
不存在于全局范围内,仅存在于其定义的范围内。
如果您传入函数,这意味着变量until
可用(它已“关闭”):
setInterval(function() {
updateTime(until);
},1000);
答案 2 :(得分:1)
您也可以将其编写为lambda表达式,如下所示:
setInterval(() => updateTime, 1000);
答案 3 :(得分:0)
您使用的是eval形式。使用:
setInterval(updateTime,1000);
答案 4 :(得分:0)
逻辑解释是变量until
不是全局变量。如果它不是全局的(或在相关的函数闭包中捕获),那么当setInterval触发并尝试计算您作为函数调用传递的字符串时它将不存在。将字符串传递给setInterval也不是一个好习惯,你应该传递一个实际的javascript函数。
至于你应该如何更改你的代码,这取决于你是否希望每次调用间隔函数时更新的值,或者你想在它运行之前只捕获一次,并将该值用于所有随后调用定时器间隔。你的代码有点模糊,你想要它的工作方式(将其捕获到一个变量中,然后尝试每次都传递它)。如果你不想更新的值,你可以这样做:
var until = $("#time").html();
function updateTime(when) {
$("#time").html(
date("d", when) + " day(s)<br />" +
date("h", when) + " hour(s)<br />" +
date("i", when) + " minute(s)<br />" +
date("s", when) + " second(s)"
);
}
setInterval(function() {updateTime(until);}, 1000);
这将捕获函数闭包中until
的范围,并使其可用于匿名间隔回调函数。将它放在像以前一样的字符串中就不会产生这样的闭包。
我还调用了updateTime(until)
来匹配updateTime()
函数的声明。
答案 5 :(得分:0)
SetInterval具有全局范围,所以我猜测直到未在全局范围内定义。将代码更改为以下两个将起作用。我相信这就是你想要做的事情。
function updateTime(){
var until = $("#time").html();
$("#time").html(
date("d", until) + " day(s)<br />" +
date("h", until) + " hour(s)<br />" +
date("i", until) + " minute(s)<br />" +
date("s", until) + " second(s)");
}
setInterval("updateTime()", 1000);
或
function updateTime(until){
$("#time").html(
date("d", until) + " day(s)<br />" +
date("h", until) + " hour(s)<br />" +
date("i", until) + " minute(s)<br />" +
date("s", until) + " second(s)");
}
setInterval(function() { updateTime($("#time").html()) }, 1000);
注意:这是假设直到每秒变化;否则,我不确定你为什么会有间隔。