3
obj = {
  go: function() { alert(this) }
}

obj.go(); // object

(obj.go)(); // object

(a = obj.go)(); // window

(0 || obj.go)(); // window

後の2つがウィンドウオブジェクトを印刷し、最初の2つが参照を印刷する理由を誰かが説明できますか。

4

1 に答える 1

6

最後の2つの形式のように、メソッドを直接実行すると、thisポインターはオブジェクトに設定されません。strictモードでない場合は、に設定されwindowます(strictモードでは、undefinedに設定されるため、エラーを検出するのに役立ちます)。ポインタは、thisJavaScriptで何かを呼び出す方法に従って設定されます。

ポインタが適切に設定されていることを常に確認する最も簡単な方法thisは、次のようなオブジェクトのコンテキストで常にメソッドを呼び出すことです。

obj.go();

ここではいくつかの例を示します。

obj.method()    // this in method automatically set to obj

var a = obj.method();
a();            // this set to window as no object context is provided

var a = obj.method();
a.call(obj)     // this explicitly set to obj by .call()
a.apply(obj)    // this explicitly set to obj by .apply()

覚えておくべきことは、obj.go元々はにプロパティとして保存されていたjavascriptの関数にすぎないということobjです。ただし、そのプロパティ値を取得すると、それは単なる関数ポインターであり、特定のオブジェクトへの明示的な関連付けはなくなります。thisメソッド内でポインタを適切に設定する場合は、オブジェクトの呼び出し方法でオブジェクトに関連付ける必要があります。これは他のいくつかの言語とは異なり、JSの多くの異なる言語と同様に、利用できる機能であると同時に、学習が混乱する場合もあります。

于 2012-12-28T20:19:15.493 に答える