2012-08-01 44 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函數將被調用。