thisコンストラクターではない関数内でランダムに使用すると、いくつかの異なる結果のいずれかが得られます。
function callThis () { return this; }
callThis(); // returns window object
var Bob = { func : callThis };
Bob.func(); // returns Bob
callThis.call(Bob); // returns Bob
Call は、呼び出しのコンテキストを決定するために使用されるメソッドです。
呼び出しのコンテキストを次の方法で判別できない場合:
を。「。」の前にあるもの ( Bob.func();)
b. .call()、.apply()またはに明示的に渡されるもの.bind()
次に、に設定されていwindowます。
それがコンテキストの解決方法です。
したがって、特定のオブジェクトを念頭に置いている場合this、解決策は次のとおりです。
function objMethod () {
var self = this;
function doStuff () {
self.otherFunc();
self.otherProperty = "bob";
}
doStuff();
}
var myObj = { myMethod : objMethod };
myObj.myMethod();
myObjobjMethodコンテキストを に設定して呼び出しますmyObj。現在のコンテキスト ( )
objMethodへの参照を として保存します。参照を使用して、参照されたオブジェクトのプロパティを変更します。myObjselfdoStuff
function outer () {
function inner () { this.property = "Bob"; }
inner.call(this);
}
var obj = {};
outer.call(obj);
ここでouterは、 を使用してコンテキストが渡されます.call()。
次に、再びofを使用innerして渡されますthisouter.call()
var bob = { name : "Bob" };
function sayName () { console.log(this.name); }
var bobFunc = sayName.bind(bob);
bobFunc();
ここでは、が常に に設定されて.bind()いるバージョンの sayName を作成するために使用します。
これらのシステムを好きなだけ自由に組み合わせて使用できます (非同期プログラミングを扱う場合は、おそらくそうするでしょう)。thisbob