3

私は決定的なガイドでこのスニペットを読みました:

function not(f)
{
  return function()
  {
    var result=f.apply(this,arguments);
    return !result;
  }
}

私が理解できないfのは、この関数はクロージャーにあるため、thisすでにthisである 、なぜこのスニペットが直接使用しないのvar result=f(arguments);ですか?

私は、最初のパラメータとして undefined/null を含む s をいくつか読みcallましたが、これは直接呼び出しに完全に置き換えることができると思います:

...
while(i>len)
{
  if(i in a)
     accumulator=f.call(undefined,accumulator,a[i],i,a);
  i++;
}
...

なぜ著者は call() を使用し、直接呼び出しを使用しなかったのですか? call()直接の関数呼び出しと最初のパラメーターとして未定義の違いはありますか?

4

1 に答える 1

4
var result=f(arguments);

...f()単一の引数、argumentsオブジェクトを渡して呼び出します。

var result=f.apply(this,arguments);

...オブジェクトf()の引数を個別に渡すことを呼び出しargumentsます(いわば)。

f()では、次のように定義されたとしましょう。

function f(a,b,c) {
    // do something with a, b, c
    return c;
}

次に、3 つの引数を指定1,2,3して直接呼び出しを行うと、次のargumentsようになります。

f([1,2,3]);

arguments(は配列に似ていることに注意してください。実際の配列ではありません。)

一方、.apply()バージョンは次のようになります。

f(1,2,3);
于 2012-11-01T05:00:59.293 に答える