2016-09-19 44 views
0

你會如何將一個無限數量的參數應用於另一個函數的參數?如何將傳遞給函數的任意數量的參數應用於JavaScript中另一個函數的參數?

這是我的嘗試:

var callIt = function(fn) { 
    for(var i = 1; arguments.length + 1; i++){ 
     return fn(arguments[i]); 
    } 
}; 

有一個在它是用來傳達問什麼運動功能:

callIt(sumAll, 1); 

也許我有太多的啤酒。 ..

callIt(sumAll, 2,3) // 5 is expected but I got 2 
+0

也許'回報FN(參數[1])從參數其餘功能參數分開;'解決問題了嗎? – StellaMaris

+0

謝謝@StellaMaris,它通過'callIt(sumAll,1)'而不是'callIt(sumAll,2,3)'或'callIt(sumAll,4,5,6)':) –

+1

如果這是一個家庭作業練習,第一段會有提示......如果該段是你自己的,你自己已經暗示瞭解決方案;)我建議你「應用」它。 – Pebbl

回答

2

充分利用argument an array,取出第一個元素,使用apply

var callIt = function(fn) { 
    var args = [].slice.call(arguments); 
    return fn.apply(null, args.slice(1)); 
} 

或者從您的代碼工作:

var callIt = function(fn) { 
    var args = []; 
    for(var i = 1; i < arguments.length; i++){ 
     args.push(arguments[i]); 
    } 
    return fn.apply(null, args); 
}; 
+1

謝謝@李豪 - 工作。我喜歡第一個雖然漂亮的優雅! –

+1

由於您已經在使用slice將參數對象轉換爲數組,因此返回fn.apply(null,[] .slice.call(arguments,1));'會更簡潔。 – Pebbl

0
function show() 
     { 
      var args = Array.prototype.slice.call(arguments,1); 
      arguments[0](args); 
     } 
0
callIt(sumAll, 2,3) // 5 is expected but I got 2 

javascript的問題return從第一次迭代for環路內秒。此外,for循環沒有condition,它將返回false。您可以利用rest parameter傳遞給callIt

var callIt = function(fn, ...args) { 
 
    var res = 0; 
 
    for(var i = 0; i < args.length; i++){ 
 
     res += fn(args[i]); 
 
    } 
 
    return res 
 
}; 
 

 
var result = callIt(function(n) { 
 
    return n 
 
}, 2,3); 
 

 
console.log(result);

相關問題