【问题标题】:clearTimeout not working because function isnt definedclearTimeout 不起作用,因为未定义函数
【发布时间】:2013-05-27 04:21:18
【问题描述】:

在你告诉我 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() 几乎是循环的。如果是某种条件,它会自行停止。但它找不到该函数,因为它还没有被声明。我该怎么做?

【问题讨论】:

  • 没关系,我解决了
  • 请您自己发布答案,而不是只说“我解决了”。
  • 你有围绕这段代码的 onLoad 处理程序吗?

标签: javascript timeout


【解决方案1】:

试试这个,

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

【讨论】:

    【解决方案2】:

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

    在你告诉我 javascript 从上到下读取代码之前,我先说我知道。

    不是这样的!

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

    loop = setTimeout(startBallEasy, 10);
    

    【讨论】:

    • 唯一正确的答案得分最低的方式有点愚蠢。
    【解决方案3】:

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

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

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

    【讨论】:

    • 我不会,因为我忘了说,在我的实际程序中,我在if...else之后有更多的方法
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多