0

在你告诉我 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

4 回答 4

0

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

如果您在此处发布的代码包含在onLoad处理程序或类似内容中,则这意味着该startBallEasy处理程序是该处理程序的本地代码,因此在全局范围内无法访问。如果您发布的代码就是全部,那么它应该可以正常工作,如此处所示警告:您的代码没有退出条件,因此您将看到源源不断的“foo is 1!”警报)。

startBallEasy正如 minitech 所提到的,解决方案是将关闭其依赖项 ( )的函数传递给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/

于 2013-05-30T14:22:30.230 回答
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);
于 2013-05-27T04:23:19.203 回答
0

函数和变量声明在 JavaScript 中被提升;您可以访问stopLoop. 它应该按原样工作。所以……</p>

在你告诉我 javascript 从上到下读取代码之前,我只想说我知道这一点。

不是那样的!

此外,将字符串传递给setTimeout是一个坏主意;就像eval。只需传递一个函数。在这种情况下,您甚至可以同时让它更短更干净!

loop = setTimeout(startBallEasy, 10);
于 2013-05-27T04:23:30.097 回答
0

您的代码中有点缺乏逻辑。你检查foo然后根据值做一些事情,然后你再次开始一个新的超时,不管怎样foo

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

function startBallEasy() {
    if(foo==1) {
        alert("foo is 1!");
        loop = setTimeout("startBallEasy()",10);
    } else {
        stopLoop();
    }    
}
于 2013-05-27T04:43:07.120 回答