2017-03-26 3 views
0
 function sum() { 
      return [].reduce.call(arguments, function(a, b) { 
      return a + b; 
      }); 
     } 

     function mul() { 
      return [].reduce.call(arguments, function(a, b) { 
      return a * b; 
      }); 
     } 

なぜ2番目のパラメータが1ですか?我々は、すべての配列やargumentsmをシフトしたい場合は、我々はスタートパラメータ1を設定する必要があるように、それは `s、我々は1を使用している場合ではない0原因、我々はキー0"applyAll"関数のこの例では、引数の後の引数が0ではなく1に設定されていますか?

function applyAll(func) { 
         return func.apply(this, [].slice.call(arguments, 1)); 
        } 

      console.log(applyAll(sum, 1, 2, 3)); // 6 
      console.log(applyAll(mul, 2, 3, 4)); // 24 
      console.log(applyAll(Math.max, 2, -2, 3)); // 3 
      console.log(applyAll(Math.min, 2, -2, 3)); // -2 

使用方法これはあると引数を失っただろう[] .slice.call(context、arg)。

var obj= [1,2,3]; 
    console.log([].slice.call(obj,0)); 


    (function() { 
    return [].slice.call(arguments,0) 
    }(1,2,3)) 

答えて

0

.call()の最初の引数はコンテキストthisは関数内であるもの、のように)です。第2引数以上は関数に送られる引数です。

0

関数applyAllの場合、最初の引数は常にfuncです。

コード例applyAll(sum, 1, 2, 3)では、引数は[sum, 1, 2, 3]です。あなたがしなければならないのは、引数としてに1, 2, 3を渡すことです。そのため、[sum, 1, 2, 3]の元の引数からindex = 1のサブ配列を取得する必要があります。あなたのコメントへ


回答:

私はあなたの手掛かりを持っていなければならないと思った。

[sum, 1, 2, 3].slice(1) = [1, 2, 3] 

参照してください? 〜sliceに渡す必要があります。それが答えです。 コンテキストと引数pseudo-array自体を混同しないでください。

+0

私は正しく質問しなかったかもしれませんが、最初の引数はコンテキストで、2番目の引数は引数であることがわかります。私はこの議論の価値がなぜ0ではなく1であるのか尋ねたいと思いますか?他のより単純な例では、[] .sliceを使って作業するとき、すべての配列または疑似配列の引数をシフトしたい場合は、 "start"引数を0に設定することはできますが、1に設定することはできません。キー0で引数が失われます。 – Dos

+0

@Dos、アップデートを確認してください。 – shuangwhywhy

関連する問題