6

次のようなコードを見ています

this.f.call(this);

または他のいくつかのケースでは

this.someObj.f.call(this.someObj);

これらとの間に違いはありますか

this.f();
this.someObj.f();

動作が異なる状況はありますか? (たとえば、thisorsomeObjが null の場合、または実際にはオブジェクトでfはない場合、または実際には関数ではない場合、動作は異なりますか?一方が例外をスローし、もう一方が例外をスローしない方法は考えられませんが、多分私は何かが欠けている...)

.call編集:明確にするために:はい、関数によって見られる値を指定するために使用できることを知っています。構文thisを使用できない場合に役立ちます(プロパティではないか、使用していないため)かどうかがわかります)。私の質問は、一般的にどのように機能するかではありません。私の質問は、オブジェクト プロパティ構文とは対照的に 使用する明確な理由が見当たらないこのケースに関するものです。obj.f()fobj.call.call

4

1 に答える 1

1

両者に違いはありません。

通常の関数呼び出しの言語仕様を確認する とFunction.prototype.call、それらがまったく同じように動作することがわかります。

すなわち、

x.f.call(x)これを行います:

[[Call]] func の内部メソッドを呼び出した結果を返し、thisArg を this 値として、argList を引数のリストとして提供します。

通常の呼び出しの場合:

func の [[Call]] 内部メソッドを呼び出した結果を返します。 thisValue を this 値として提供し、リスト argList を引数値として提供します。

どこthisに解像度がありますか (仕様の 11.2.3 7.bi で指定されています)。

すべての最新の JavaScript 実装 (そうです、最新の IE8 でさえも) はこれを尊重します。

于 2013-08-31T17:29:37.020 に答える