setInterval不起作用?

时间:2011-08-10 15:41:13

标签: javascript jquery

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()是对的。

6 个答案:

答案 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);

注意:这是假设直到每秒变化;否则,我不确定你为什么会有间隔。