jquery setInterval不起作用?

rslzwgfq  于 2023-03-01  发布在  jQuery
关注(0)|答案(7)|浏览(244)
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);

每次运行此程序时,都会出现以下错误:
未捕获引用错误:未定义until(匿名函数)
我看不出哪里出了问题。我试着谷歌了很多,但我找到的每一个页面都说setInterval()是正确的。

omjgkv6w

omjgkv6w1#

密封件:

setInterval(function() {updateTime(until); }, 1000);
yv5phkfx

yv5phkfx2#

问题是你把代码作为字符串传递给setInterval,这意味着它是在全局作用域中计算的,变量until不存在于全局作用域中,只存在于定义它的作用域中。
如果你传入一个函数,这意味着变量until是可用的(它是“封闭的”):

setInterval(function() {
    updateTime(until);
},1000);
3hvapo4f

3hvapo4f3#

如果在setInterval()内调用带参数的函数,则必须将参数作为实参添加到setInterval()函数。
外观:setInterval() - Web APIs | MDN
在您的情况下,请尝试以下操作:

setInterval('updateTime', 1000, until);

11岁的问题,但愿它帮助别人

ni65a41a

ni65a41a4#

逻辑上的解释是变量until不是全局变量。如果它不是全局变量(或者捕获在相关函数闭包中),那么当setInterval触发并试图计算作为函数调用传递的字符串时,它将不再存在。向setInterval传递字符串也不是一个好习惯,您应该传递一个实际的javascript函数。
至于应该如何更改代码,这取决于您是希望在每次调用interval函数时更新until的值,还是希望在它运行之前捕获它一次,并将该值用于计时器间隔的所有后续调用。(将until捕获到变量中一次,但每次都尝试将其传入)。如果您不希望until的值被更新,您可以这样做:

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()函数的声明相匹配。

kqqjbcuj

kqqjbcuj5#

你也可以把它写成一个lambda表达式,如下所示:
setInterval(() => updateTime, 1000);

0md85ypi

0md85ypi6#

您正在使用eval的形式。用途:

setInterval(updateTime,1000);
nszi6y05

nszi6y057#

SetInterval有全局作用域,所以我猜until没有在全局作用域中定义。把你的代码改成下面两个就行了。我相信这就是你要做的。

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

注:这是假设until每秒变化一次;否则我不知道你为什么会有间歇。

相关问题