2017-01-13 33 views
0

我想創建一個對函數進行排序並調用它的函數。問題是每個函數可能有不同數量的參數,並且這些參數必須在排序之前傳遞。例如:在javascript中對函數數組進行排序

function sortFunciton(arrayOfFunctions) { 

} 

mySortedFunction = sortFunction([function1('a', 'b'), function2('a'), function3('a','b','c')]) 

的問題是,如果我通過這樣的陣列中,我將已經傳遞函數的值,但我不希望排序之前要執行這些功能,因爲他們計算量很大,所以只能執行一個,這就是爲什麼我要排序。

難道沒有辦法通過這樣的:

mySortedFunction = sortFunction([function1.args('a', 'b', 'c')], function2.args('a'), function3.args('a', 'b', 'c')]) 

,然後做

mysortedFunction.callWithArgs() 

+1

'function.prototype.bind'可以幫助 –

+0

你不能比較函數,所以我不知道你會如何排序它們?你究竟是什麼意思「*所以只有一個必須執行,這就是爲什麼我排序*」? – Bergi

回答

1

您可以通過使用Function.prototype.bind經過一定的綁定參數不被調用的函數的引用:

function selectFunc(funcArray) { 
    //some selection criteria 
    return funcArray[0]; 
} 

mySelectedFunc = selectFunc([function1.bind(null, 'a', 'b'), function2.bind(null, 'a'), function3.bind(null, 'a','b','c')]); 

mySelectedFunc() //equivalent of running function1('a', 'b') 
+0

然後我只是調用mySortedFunction()? – Gatonito

+0

以下模式允許您避開一組函數,而不是函數結果數組。 sortFunction應該做些什麼? – hackerrdave

+0

它必須選擇這些函數中的一個來調用這些參數。 – Gatonito

0

您可以使用.bind然後就打電話給你的函數不帶參數(它將與已綁定的參數來調用)

function add(a, b) { return a + b; } 
 
function mult(a, b) { return a * b; } 
 
var functions = [add.bind(this, 1, 1), mult.bind(this, 5, 5)]; 
 

 
functions.forEach(f => console.log(f()));

0
function sortFunciton(arrayOfFunctions) { 

} 

var mySortedFunction = sortFunction([ 
    { func: function1, arguments: ['a', 'b']}, 
    { func: function2, arguments: ['a']}, 
    { func: function3, arguments: ['a', 'b', 'c']} 
]); 

for (var i = 0; i < mySortedFunction.length; i++) 
{ 
    mySortedFunction[i].func.apply(this, mySortedFunction[i].arguments); 
};