5

apply を使用してメソッドを呼び出していますが、渡す引数の数がわかりません。

現時点では、私のコードは次のようになります。

selectFolder: function(e){
  e.preventDefault();

  this.addSelectedClass.apply(this, Array.prototype.slice.call(arguments));
},

私が Array.prototype.slice を使用している唯一の理由は、ほとんどの例にあるからです。

次のような引数を渡さないのはなぜですか。

 this.addSelectedClass.apply(this, arguments);
4

2 に答える 2

6

arguments元気apply()です

関数を呼び出すときapplyは、 original を使用しても問題ありませんarguments。あなたの例では、この行を次の行に簡単に置き換えることができます。

this.addSelectedClass.apply(this, arguments);

argumentscall()はうまくありません

ただし、呼び出している場合は、関数に任意のオブジェクト/値の配列を渡したい場合は、実際の配列にcall変換する必要があります(これは呼び出しによって行われます)。そのため、渡したい引数の数が正確にわかっていて、それらを個別に渡す場合に通常使用されます。argumentsslice()call()

arguments実際の配列オブジェクトではありません。それらは (lengthたとえばプロパティを持っている) ように見えますが、そうではありません。

Mozilla 開発者ネットワークに関する議論

完全に明確にするための少しの説明

に関連するドキュメントは次のようにapply()なりcall()ます。

func.apply(thisArg[, argsArray]);
func.call(thisArg[, arg1[, arg2[, ...]]]);

これらのいずれかを使用して同じ機能を実行する場合があります。

  1. 使用apply()すると、すべての引数を一度に渡すことができます。通常、呼び出しから特定の引数を省略したり、実際の配列slice()に変換したりするために使用されます。arguments

  2. 使用するときcall()は、個々の引数と必要な数を渡します。配列に変換された引数を提供する場合、呼び出された関数は、その特定の配列で提供されるすべての引数を使用して、配列型の 1 つのパラメーターを取得します。

これでさらに問題が解決することを願っています。

于 2012-08-20T15:06:03.340 に答える
3

argumentsは配列ではないためです。実行すると、や などArray.prototype.sliceの関数を含む通常の配列になります。基本的に何でも。これがなければ、プロパティを持つ単なるオブジェクトです。mapforEachArray.prototypeargumentslength

あなたの特定のケースでは、渡すだけargumentsでおそらくうまくいくでしょう。

于 2012-08-20T15:01:24.893 に答える