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()
是正确的。
7条答案
按热度按时间omjgkv6w1#
密封件:
yv5phkfx2#
问题是你把代码作为字符串传递给
setInterval
,这意味着它是在全局作用域中计算的,变量until
不存在于全局作用域中,只存在于定义它的作用域中。如果你传入一个函数,这意味着变量
until
是可用的(它是“封闭的”):3hvapo4f3#
如果在
setInterval()
内调用带参数的函数,则必须将参数作为实参添加到setInterval()
函数。外观:setInterval() - Web APIs | MDN
在您的情况下,请尝试以下操作:
11岁的问题,但愿它帮助别人
ni65a41a4#
逻辑上的解释是变量
until
不是全局变量。如果它不是全局变量(或者捕获在相关函数闭包中),那么当setInterval触发并试图计算作为函数调用传递的字符串时,它将不再存在。向setInterval传递字符串也不是一个好习惯,您应该传递一个实际的javascript函数。至于应该如何更改代码,这取决于您是希望在每次调用interval函数时更新until的值,还是希望在它运行之前捕获它一次,并将该值用于计时器间隔的所有后续调用。(将until捕获到变量中一次,但每次都尝试将其传入)。如果您不希望until的值被更新,您可以这样做:
这将在函数闭包中捕获
until
的作用域,并使其可用于匿名区间回调函数。将其放入字符串中,就像之前所做的那样,不会创建这样的闭包。我还使
updateTime(until)
的调用与updateTime()
函数的声明相匹配。kqqjbcuj5#
你也可以把它写成一个lambda表达式,如下所示:
setInterval(() => updateTime, 1000);
0md85ypi6#
您正在使用eval的形式。用途:
nszi6y057#
SetInterval有全局作用域,所以我猜until没有在全局作用域中定义。把你的代码改成下面两个就行了。我相信这就是你要做的。
或
注:这是假设until每秒变化一次;否则我不知道你为什么会有间歇。