clearTimeout无法正常工作,因为未定义函数

时间:2013-05-27 04:21:18

标签: javascript timeout

在你告诉我javascript从上到下读代码之前,让我说我知道。所以我有一个名为startBallEasy()的函数页面,其下有一个名为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);
}

所以startBallEasy()几乎循环自己。如果是某种条件,它将自行停止。但它无法找到该功能,因为它还没有被声明。我该怎么做?

4 个答案:

答案 0 :(得分:0)

试试这个,

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

答案 1 :(得分:0)

JavaScript中提升函数和变量声明;您有权访问stopLoop。它应该按原样运作。所以......

  

在你告诉我javascript从上到下阅读代码之前,请允许我说我知道。

它不是那样的!

此外,将字符串传递给setTimeout是一个坏主意;它就像eval。只需传递一个功能。在这种情况下,您甚至可以同时缩短和清洁它!

loop = setTimeout(startBallEasy, 10);

答案 2 :(得分:0)

您的代码中缺少逻辑。您检查foo,然后根据值执行某些操作,然后再次开始新的超时,但foo是什么。

要解决此问题,您需要将超时移至if

function startBallEasy() {
    if(foo==1) {
        alert("foo is 1!");
        loop = setTimeout("startBallEasy()",10);
    } else {
        stopLoop();
    }    
}

答案 3 :(得分:0)

传递给setTimeout的字符串或函数将在全局上下文中执行。

如果您在此处发布的代码包含在onLoad处理程序或类似代码中,则这意味着startBallEasy是该处理程序的本地代码,因此无法在全局范围内访问。如果您发布的代码完全没有,那么它应该可以正常运行,如所示here(警告:您的代码没有退出条件,所以您将看到的是“foo为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的状态:http://jsfiddle.net/JWyzy/