2013-06-22 72 views
2

將函數傳遞給另一個使用它來縮小範圍查找的函數是否更好?我對這件事感到很困惑。將函數傳遞給另一個函數?

不通過它;

function loadSuccess(a, b, c) { 

}; 

function image(url, name, info) { 

    var asset = new Image(); 
    asset.addEventListener("load", function(name, info) { 
     return function() { 
      loadSuccess(this, name, info); 
     }; 
    }(name, info), false); 
    asset.src = url; 
}; 

image(a, b, c); 

並通過它;

function loadSuccess(a, b, c) { 

}; 

function image(url, name, info, loadSuccess) { 

    var asset = new Image(); 
    asset.addEventListener("load", function(name, info, func) { 
     return function() { 
      func(this, name, info); 
     }; 
    }(name, info, loadSuccess), false); 
    asset.src = url; 
}; 

image(a, b, c, loadSuccess); 

回答

3

性能優勢可能是可忽略的,但通過回調使您的函數更加靈活,如果需要,您可以在不同的情況下傳遞不同的回調。

但是,我在代碼中看到一個問題:tt從異步回調中返回任何內容是沒有意義的。這不是你要返回的image函數,而是你傳遞給addEventListener的內部匿名函數。

考慮這些問題,我會改變的代碼如下:

function loadSuccess(a, b, c) { 

}; 

function image(url, name, info, func) { 
    var asset = new Image(); 
    asset.addEventListener("load", function(e) { 
     func(this, name, info); 
    }, false); 
    asset.src = url; 
}; 

image(a, b, c, loadSuccess); 

我也去掉了立即調用函數你有,我看不出有什麼好的理由有使用它。

+0

'function(...){...}(...)'應該用括號括起來,以便開發人員知道它是一個IIFE而不是回調。 –

+0

我甚至沒有注意到IIFE(這使我以前的版本錯誤)。現在修正了兩個。 – bfavaretto

+0

感謝你們,我有一個匿名返回函數,因爲我正在重寫代碼,它以前是在for循環中的一個函數調用中,所以我必須維護一個閉包,以便名稱和信息保存在那裏每個循環迭代,感謝您發現它,雖然我沒有! – user2251919

1

兩個工作正常,但我認爲這是送一個回調函數作爲參數很好的做法。

+0

很酷,我知道兩者都可以,但我喜歡以標準方式編碼,謝謝。 – user2251919

0

第一個選項是當圖像函數總是需要調用這個loadSucces函數時使用。

第二種選擇是在您需要選擇要執行的回調函數時使用。

還有第三個選項,其中第四個參數是optionnal:

function image(url, name, info, loadSuccessParameter) { 
    loadSuccessParameter= loadSuccessParameter || loadSuccess; 
    [...] 

} 

所以,你可以調用這個方法:圖像(A,B,C),或者是這樣的:圖像(A,B,C ,otherLoadSuccess);

我希望它有幫助。

相關問題