2016-08-02 112 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

啊,我刚刚完成了你的答案,摆脱了函数发生器,但你也做到了!谢谢,完美的答案,以改善我的代码! –