修复
如何使用setInterval
这是使用的正确方法(稍后解释)setInterval()
:
setInterval(cal, 5000);
编写此代码的一种可能方法
$(document).ready(function(){
var b = 0;
function cal() {
b++;
$('#print').html(b + '<br/>');
if (b === 4) {
clearInterval(to);
}
};
var to = setInterval(cal, 5000);
});
jsFiddle 演示
当然还有改进的地方,比如你可以缓存$('#print')
. 您不需要每次都获取它。
...
var $print = $('#print'); //save it to a variable
function cal() {
b++;
$print.html(b + '<br/>'); //use the cached version
...
问题
字符串而不是函数 -> eval
!
虽然从技术上讲,您可以将字符串setInterval
作为其第一个参数传递,但它等同于使用eval
. 正如我们所知,eval
是邪恶的,只有在你真的知道自己在做什么的情况下才使用它。这同样适用于setTimeout
。无论您在 w3schools和其他过时的资源上看到了什么,都不应将字符串传递给这些方法。传递一个函数。
eval
with的范围setInterval
eval
使用with的问题之一setInterval()
是它试图在全局范围内的字符串中运行您的代码,这就是您收到错误的原因。setInterval
在 上定义window
,并在其范围内运行。您在传递给的闭包的范围内document.ready()
,并且函数在此范围内定义。eval
试图在不存在的全局范围内找到它。