2014-07-23 31 views
0

我有一個回調函數調用array.forEach的功能,這將是更好的功能之外創建回調這樣這是更有效的方法來創建一個簡單的JavaScript回調?

foo=(function(){  

    var f=function(v){ 
    //long function 
    }; 

    return function(){ 
    array.forEach(f); 
    }; 
}()); 

或者只是把它內聯這樣

function foo(){  
    array.forEach(function(v){ 
    //long function 
    }); 
} 

由於//long function只能創建一次,或者被緩存了,或者在示例二中有些東西?

編輯:

當我嘗試 a=function() {return function(){};}a()!==a() 但是當我做

a=(function() { 
    var a=function(){}; 
    return function(){ 
     return a; 
    }; 
}()); 

a()===a()

這是否意味着少使用兩個號碼創建的對象?

+1

'f'只能創建一次。 –

+0

我想如果你不需要在其他地方使用那個函數,你可以使用'inline'。但有時候我會在變量中提取它,因爲它會損壞縮進。 – Mritunjay

+0

我知道f只創建一次,但實例2中的回調不止一次創建? –

回答

0

在這兩種情況下,您總是返回對相同功能的引用。在您的代碼運行時,JavaScript解釋器已經解析了整個文件並在內存中創建了所有函數。它不會在您每次返回時創建函數代碼的全新副本。


以上其實是有點過於簡單化,因爲JavaScript的支持closures,這讓你從返回「相同」的功能有不同的影響。請看下面的代碼:

function makeGreeter(salutation) { 
    return function(addressee) { 
     return salutation + ", " + addressee + "!"; 
    } 
} 

var sayHelloTo = makeGreeter("Hello"); 
var sayGoodbyeTo = makeGreeter("Goodbye"); 

var helloWorld = sayHelloTo("World"); // "Hello, World!" 
var helloUniverse = sayHelloTo("Universe"); // "Hello, Universe!" 
var goodbyeWorld = sayGoodbyeTo("World"); // "Goodbye, World!" 
var goodbyeUniverse = sayGoodbyeTo("Universe"); // "Goodbye, Universe!" 

顯然makeGreeter功能真的不能每次都返回同樣的事情,因爲makeGreeter("Hello")makeGreeter("Goodbye")必須產生不同的功能。所以你會從這些調用中獲得兩個不同的函數對象,但它們並不是函數代碼的完整副本。相反,他們將共享相同的代碼,但爲該代碼使用的salutation參數保存不同的值。

+0

Aaah好吧,我現在得到那部分:) –

相關問題