Red*_*lar 8 javascript function definition callback anonymous-function
我正在尝试等待,然后在数组中的所有图像都已完成加载(使用.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();
})();
Run Code Online (Sandbox Code Playgroud)
删除函数调用,并取出引号.如果不放引号,则setTimeout直接引用它稍后可以调用的函数.但是,如果在诸如"checkForAllImagesLoaded"或之类的字符串中"checkForAllImagesLoaded()",则会在超时发生时执行传入的代码.
那时,checkForAllImagesLoaded将在全局对象(窗口)中搜索但是没有在那里定义,原因是你得到undefined错误的原因.
您的代码包含在一个自调用匿名函数中,并且它checkForAllImagesLoaded不存在.因此,在setTimeout调用中直接引用该函数,而不是字符串.
setTimeout(checkForAllImagesLoaded, 20);
Run Code Online (Sandbox Code Playgroud)
setTimeout 可以使用函数(和可选参数)或包含JavaScript代码的字符串调用:
var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4067 次 |
| 最近记录: |