2012-08-01 71 views
1

下面是一个函数的源代码,它将图像预加载到页面上,作者在一些注释中添加了解释代码如何工作的内容,但我仍然不完全理解它。具体来说,他声称这个函数的返回值是一个带有“done()”方法的空对象,该方法调用预定义的匿名函数“postaction()”。这段代码的用户是否应该将他/她自己的代码输入到第2行的空postaction函数中?如果这就是它的工作原理,那么返回对象中的“postaction = f || postaction”是做什么的?javascript中的匿名函数和空返回对象

的源代码:

function preloadimages(arr){ 
    var newimages=[], loadedimages=0 
    var postaction=function(){} 
    var arr=(typeof arr!="object")? [arr] : arr 
    function imageloadpost(){ 
     loadedimages++ 
     if (loadedimages==arr.length){ 
      postaction(newimages) //call postaction and pass in newimages array as parameter 
     } 
    } 
    for (var i=0; i<arr.length; i++){ 
     newimages[i]=new Image() 
     newimages[i].src=arr[i] 
     newimages[i].onload=function(){ 
      imageloadpost() 
     } 
     newimages[i].onerror=function(){ 
     imageloadpost() 
     } 
    } 
    return { //return blank object with done() method 
     done:function(f){ 
      postaction=f || postaction 
      //remember user defined callback functions to be called when images load 
    } 
    } 
} 

链接到作者的页面:http://www.javascriptkit.com/javatutors/preloadimagesplus.shtml

+0

如果对象是空的,它将不包含done方法。 – 2012-08-01 13:54:50

+0

在作者的页面上,他将其称为空对象 – imkendal 2012-08-01 13:55:45

+1

看起来他错误地使用术语“空白对象”来表示[object literal](https://developer.mozilla.org/en/JavaScript/Guide/Values, _Variables,_and_Literals#Object_literals)。 – 2012-08-01 13:57:43

回答

2

您可以输入自己的功能postaction,虽然它不是像你可能期望的回调函数。

但是,它返回一个有完成功能的对象。

如果你这样做。像

preloadimages().done(function() { 
    console.log('done') 
}); 

您的功能将被执行。如果你不提供作为完成参数的功能,默认postaction将被调用,并且什么也不做,因为它是一个空函数

1

从阅读该代码,它看起来像你不打算重新定义postaction() - 事实上,你根本不需要修改任何这些代码。实际上,您预计会将一个函数作为参数传递给done()函数,稍后将在成功加载图像时调用函数(“回调函数”)。

这条线:

postaction=f || postaction 

的意思是 “˚F值分配给postaction如果˚F有一个值,以其他方式转让postaction本身”(即不发生变化。它)。

1

我不知道这段代码的用途是什么,但是返回的对象有一个可以使用的函数,可以使用或不使用函数参数。

内完成,这种说法

f || postaction 

含义F或postaction返回f若f不是空/未定义或postaction一样,因此,如果调用

myreturnObject.done(); 

这个计算结果为

postaction = postaction 

因为f没有定义。如果你打电话

myreturnObject.done(function(newImages) { ... }); 

这个计算结果为

postaction = f. 

Postaction然后中使用的在imageLoadPost函数循环。如果你需要一些自己的编码,你可以将它作为参数传递给done方法,如图所示。如果您不需要任何其他编码,请不要传递函数来进行后置处理。那么定义为回退的空postaction函数将被调用。