Javascript clearTimeout不工作,因为未定义函数

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

在您告诉我javascript从上到下读取代码之前,让我先说我知道这一点。因此,我有一个页面,其中一个函数名为
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
之后我有更多的方法,我解决了请你自己发布答案,而不是说“我解决了”。你有一个关于这段代码的加载处理程序吗?这有点愚蠢,为什么唯一正确的答案得分最低。