2番目の関数の呼び出しは、オブジェクトのコンテキストからではなく、最初の呼び出しから返された関数から行われます。
オブジェクトコンテキストがないため、他の関数と同じようにthis
値がデフォルトになります。window
// v-----------------v------function has context
alert(object.getNameFunc()());
// -----------^----second function was returned from the first
// and invoked so there's no object context
代わりに、返された関数をに割り当て、object
そのコンテキストから呼び出した場合、this
はへの参照になりobject
ます。
obj.foo = object.getNameFunc();
obj.foo(); // "My Object"
まったく同じ関数ですが、現在はのプロパティとして呼び出されており、object
暗黙的にそのthis
値を。に設定しますobject
。
のルールはthis
非常にシンプルで理解しやすいですが、最初は期待したものではないかもしれません。
値は非常に動的であり、関数の呼び出し方法にthis
完全に基づいています。
foo(); // 'this' is 'window'
object.foo(); // 'this' is 'object'
foo.call(object); // 'this' is 'object'
foo.apply(object);// 'this' is 'object'
var bar = foo.bind(object);
bar(); // 'this' is 'object'
window
したがって、デフォルトは、別のオブジェクトへの接続なしで関数が呼び出された場合であることがわかります。
しかし、関数をオブジェクトのプロパティとして呼び出すと、this
突然そのオブジェクトを参照します。
.call
または、、.apply
またはを使用して、関数呼び出し.bind
の値を手動で設定できます。this