2016-09-19 20 views
0

別の関数のパラメータである関数に、無制限の引数をどのように適用しますか?どのようにJavaScriptに別の関数の引数である関数に渡される任意の数の引数を適用しますか?

これは私が試したものです:

callIt(sumAll, 1); 

たぶん私は持っていた、あまりにも多くのビール:

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

要求されているものを伝えるために使用され、運動中の機能があります。 ..

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

多分 'リターンは、fn(引数[i])とに渡されたパラメータの残りの部分から別の関数のパラメータにrest parameterを利用することができます;'あなたの問題を解決しますか? – StellaMaris

+0

ありがとう@StellaMaris、 'callIt(sumAll、2,3)'や 'callIt(sumAll、4,5,6)'ではなく 'callIt(sumAll、1)'を渡します。 –

+1

これが宿題の演習では、最初の段落にヒントがあります。その段落が自分のものであれば、あなた自身が解決策を示唆しています;)あなたがそれを '適用する 'ことをお勧めします。 – Pebbl

答えて

2

は、最初の要素を削除し、argument an arrayを作るapplyを使用しています。

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

またはあなたのコードから作業:質問return sで

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

ありがとう@ Lihau - それは働いた。私は最初のかなりエレガントなのが好きです! –

+1

既にスライスを使用して引数オブジェクトを配列に変換しているので、 'return 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最初の繰り返しでforループ内から。また、forループにはconditionがなく、falseを返します。あなたは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);

関連する問題