obj = {
go: function() { alert(this) }
}
obj.go(); // object
(obj.go)(); // object
(a = obj.go)(); // window
(0 || obj.go)(); // window
後の2つがウィンドウオブジェクトを印刷し、最初の2つが参照を印刷する理由を誰かが説明できますか。
obj = {
go: function() { alert(this) }
}
obj.go(); // object
(obj.go)(); // object
(a = obj.go)(); // window
(0 || obj.go)(); // window
後の2つがウィンドウオブジェクトを印刷し、最初の2つが参照を印刷する理由を誰かが説明できますか。
最後の2つの形式のように、メソッドを直接実行すると、this
ポインターはオブジェクトに設定されません。strictモードでない場合は、に設定されwindow
ます(strictモードでは、undefinedに設定されるため、エラーを検出するのに役立ちます)。ポインタは、this
JavaScriptで何かを呼び出す方法に従って設定されます。
ポインタが適切に設定されていることを常に確認する最も簡単な方法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の多くの異なる言語と同様に、利用できる機能であると同時に、学習が混乱する場合もあります。