Javascript clearTimeout不工作,因为未定义函数
在您告诉我javascript从上到下读取代码之前,让我先说我知道这一点。因此,我有一个页面,其中一个函数名为Javascript clearTimeout不工作,因为未定义函数,javascript,timeout,Javascript,Timeout,在您告诉我javascript从上到下读取代码之前,让我先说我知道这一点。因此,我有一个页面,其中一个函数名为startBaleasy(),另一个函数名为stopLoop()。基本上是这样的: var foo = 1; var loop; function startBallEasy() { if(foo==1) { alert("foo is 1!"); } else { stopLoop(); } loop = setTim
startBaleasy()
,另一个函数名为stopLoop()
。基本上是这样的:
var foo = 1;
var loop;
function startBallEasy() {
if(foo==1) {
alert("foo is 1!");
} else {
stopLoop();
}
loop = setTimeout("startBallEasy()",10);
}
function stopLoop() {
clearTimeout(loop);
}
因此,startBaleasy()
基本上是循环本身。如果是某种情况,它会自动停止。但是它找不到函数,因为它还没有被声明。我该怎么做?试试这个
var loop=null;
function startBallEasy() {
if(foo==1) {
alert("foo is 1!");
} else {
clearTimeout(loop);
}
loop = setTimeout("startBallEasy()",10);
}
setTimeout("startBallEasy()",10);
您可以使用setInterval
(如果您不想使用递归函数)来代替setTimeout
类似
var foo = 1;
var loop=null;
function startBallEasy() {
if(foo==1) {
alert("foo is 1!");
} else {
clearInterval(loop);
}
}
loop = setInterval("startBallEasy()",10);
函数和变量声明用JavaScript实现;您可以访问
stopLoop
。它应该按原样工作。所以
在您告诉我javascript从上到下读取代码之前,让我先说我知道这一点
不是那样的
另外,将字符串传递给setTimeout
是个坏主意;这就像eval
。只需传递一个函数。在这种情况下,您甚至可以使它更短,同时更干净
loop = setTimeout(startBallEasy, 10);
代码中有点缺乏逻辑。您检查
foo
,然后根据该值执行某些操作,然后再次启动一个新的超时,不管foo
是什么
要解决此问题,您需要将超时移到中,如果:
function startBallEasy() {
if(foo==1) {
alert("foo is 1!");
loop = setTimeout("startBallEasy()",10);
} else {
stopLoop();
}
}
传递给setTimeout
的字符串或函数将在全局上下文中执行
如果您在此处发布的代码包装在onLoad
处理程序或类似程序中,这意味着startBallEasy
是该处理程序的本地处理程序,因此在全局范围内不可访问。如果您发布的代码是所有代码,那么它应该可以正常工作,正如演示的那样(警告:您的代码没有退出条件,因此您将看到源源不断的“foo is 1!”警报)
正如minitech所提到的,解决方案是将关闭其依赖项(startBallEasy
)的函数传递到setTimeout
var foo = 1;
var loop;
function startBallEasy() {
if(foo==1) {
alert("foo is 1!");
} else {
stopLoop();
}
loop = setTimeout(function(){startBallEasy();},10);
}
function stopLoop() {
clearTimeout(loop);
}
请注意,您的代码当前没有退出条件。这里是一个稍微修改的演示,从0计数到9,记录每次迭代时foo
的状态:我不能,因为我忘了提到,在我的实际程序中,在if…else
之后我有更多的方法,我解决了请你自己发布答案,而不是说“我解决了”。你有一个关于这段代码的加载处理程序吗?这有点愚蠢,为什么唯一正确的答案得分最低。