函数调用本身不起作用(无限循环,Javascript)

时间:2010-06-30 01:29:11

标签: javascript function callback definition anonymous-function

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

})();

3 个答案:

答案 0 :(得分:8)

删除函数调用,并取出引号。如果你没有引用引号,setTimeout会直接引用它稍后可以调用的函数。但是,如果在"checkForAllImagesLoaded""checkForAllImagesLoaded()"之类的字符串中,则会在超时发生时执行传入的代码。

那时,checkForAllImagesLoaded将在全局对象(窗口)中搜索,但在那里没有定义,原因就是你得到undefined错误的原因。

您的代码包含在自调用匿名函数中,并且它之外的checkForAllImagesLoaded不存在。因此,在setTimeout调用中直接引用该函数,而不是字符串。

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

setTimeout

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

答案 1 :(得分:1)

删除settimeout调用中的()。

setTimeout('checkForAllImagesLoaded', 20);

答案 2 :(得分:1)

使用您的代码,您可以为每个呼叫设置多个超时。您应该在每次checkForAllImagesLoaded()调用时设置一次超时,并且可能会增加等待时间(20毫秒太快)。 E.g。

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!
  }
}