2016-08-02 149 views
3

我有一個函數,它的索引作爲參數:動態生成一個函數數組集成一個參數?

function awesomeFunction(index) { 
 
    console.log(index); // does awesome stuff depending on the index 
 
}

現在,我想動態地創建這樣的功能的陣列,每一個使用無參數在所有。以下是我心目中:

function generateAwesomeFunction(index) { 
 
    return function() { 
 
    console.log(index); 
 
    } 
 
} 
 

 
var awesomeArray = []; 
 

 
for (var i=0 ; i<something ; i++) { 
 
    awesomeArray.push(generateAwesomeFunction(i)); 
 
}

在我的扭曲的心靈,輸出awesomeArray應該包含的功能,這些都不需要任何參數,但所有這些做,因爲index不同的東西在生成時在函數中是INTEGRATED。例如,下面的調用執行不同的代碼:

awesomeArray[0](); 
 
awesomeArray[1](); 
 
// and so on...

正在運行的例子是:

function awesomeFunction(index) { 
 
    console.log(index); // does awesome stuff depending on the index 
 
} 
 

 
function generateAwesomeFunction(index) { 
 
    return function() { 
 
    console.log(index); 
 
    } 
 
} 
 

 
var awesomeArray = []; 
 

 
for (var i=0 ; i<5 ; i++) { 
 
    awesomeArray.push(generateAwesomeFunction(i)); 
 
} 
 

 
awesomeArray[0](); // 0 
 
awesomeArray[1](); // 1 
 
awesomeArray[2](); // 2 
 
// and so on...

問題:

  1. 它工作嗎? --->是!
  2. 有沒有更好的方式來生成該函數的數組?
+1

'功能#bind'? – gcampbell

+2

*它工作嗎?*你嘗試過嗎? –

+0

@Matt Burland:剛剛做了,產生了一個未定義的錯誤,更新了我的問題。抱歉。 –

回答

2

使用bind和部分應用程序從awesomeFunction,將永遠與特定index參數調用創建一個新的功能。在這種情況下,您向該函數發送什麼值this並不重要。

您不需要generateAwesomeFunction函數。

function awesomeFunction(index) { 
 
    console.log(index); // does awesome stuff depending on the index 
 
} 
 
var awesomeArray = []; 
 

 
for (var i=0 ; i<5 ; i++) { 
 
    awesomeArray.push(awesomeFunction.bind(this, i)); 
 
} 
 

 
awesomeArray[0](); // 0 
 
awesomeArray[1](); // 1 
 
awesomeArray[2](); // 2

+0

啊,我剛剛完成了你的答案,擺脫了函數發生器,但你也做到了!謝謝,完美的答案,以改善我的代碼! –