【问题标题】:Function calling itself not working (infinite loop, Javascript)调用自身的函数不起作用(无限循环,Javascript)
【发布时间】:2011-03-09 22:08:43
【问题描述】:

根据答案here,我正在尝试等待,然后在数组中的所有图像都完成加载(使用 .complete)时收到一条消息。因此,我设置了一个无限循环,如下所示。但是,当我运行它时,我收到一个错误,即未定义 checkForAllImagesLoaded()。这段代码通过一个小书签运行,因此它全部包含在一个匿名函数构造中(如下所示)。如果我在该构造之外重新定义我的函数和变量,它就可以工作。但这似乎是编写书签的一种糟糕方法。我该如何解决这个问题,以便它在 setTimeout 之后仍能识别该功能?

(function() {

    //var images = array of images that have started loading

    function checkForAllImagesLoaded(){
        for (var i = 0; i < images.length; i++) {
            if (!images[i].complete) {
               setTimeout('checkForAllImagesLoaded()', 20);
               return;
            }
        }
    }

    checkForAllImagesLoaded();

})();

【问题讨论】:

    标签: javascript function callback definition anonymous-function


    【解决方案1】:

    去掉函数调用,去掉引号。如果你不加引号,setTimeout 会直接引用它以后可以调用的函数。但是,如果在"checkForAllImagesLoaded""checkForAllImagesLoaded()" 等字符串中,则会在发生超时时执行传入的代码。

    那时,checkForAllImagesLoaded 将在全局对象(窗口)中搜索,但未在此处定义,原因是您收到 undefined 错误。

    您的代码被包装在一个自调用匿名函数中,而在它之外checkForAllImagesLoaded 不存在。因此,在 setTimeout 调用中传递对函数的直接引用,而不是字符串。

    setTimeout(checkForAllImagesLoaded, 20);
    

    setTimeout 可以使用函数(和可选参数)或包含 JavaScript 代码的字符串调用:

    var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
    var timeoutID = window.setTimeout(code, delay);
    

    【讨论】:

      【解决方案2】:

      删除 settimeout 调用中的 ()。

      setTimeout('checkForAllImagesLoaded', 20);

      【讨论】:

      • 这行不通,因为浏览器将尝试在全局范围内执行 eval('checkForAllImagesLoaded') 的等效项,其中没有定义名称 checkForAllImagesLoaded
      【解决方案3】:

      使用您的代码,您可以设置每次调用的超时次数。您应该为每个checkForAllImagesLoaded() 调用设置一次超时,并可能增加等待时间(20 毫秒太快了)。例如

      function checkForAllImagesLoaded() {
        var allComplete=true;
        var i=0;
      
        while (i<images.length && allComplete) {
          allComplete=images[i++].complete;
        }
      
        if (!allComplete) { // Any incomplete images?
          setTimeout('checkForAllImagesLoaded()',1000); // Wait a second!
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多