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();
myObj
objMethod
コンテキストを に設定して呼び出しますmyObj
。現在のコンテキスト ( )
objMethod
への参照を として保存します。参照を使用して、参照されたオブジェクトのプロパティを変更します。myObj
self
doStuff
function outer () {
function inner () { this.property = "Bob"; }
inner.call(this);
}
var obj = {};
outer.call(obj);
ここでouter
は、 を使用してコンテキストが渡されます.call()
。
次に、再びofを使用inner
して渡されますthis
outer
.call()
var bob = { name : "Bob" };
function sayName () { console.log(this.name); }
var bobFunc = sayName.bind(bob);
bobFunc();
ここでは、が常に に設定されて.bind()
いるバージョンの sayName を作成するために使用します。
これらのシステムを好きなだけ自由に組み合わせて使用できます (非同期プログラミングを扱う場合は、おそらくそうするでしょう)。this
bob