javascript に関するいくつかのドキュメントを読んでいて、次のコード例に出くわしました。
var o = {
value: 1,
outer: function () {
var inner = function () {
console.log(this); //bound to global object
};
inner();
}
};
o.outer();
を出力しますwindow
。
キーワードが親オブジェクト ( ) ではなくグローバル オブジェクト ( ) にバインドされている理由がわかりません。のスコープから
アクセスする場合は、(それ自体を渡すのと同じように) をそのローカル関数に引数として渡す必要があります。したがって、予想どおり:this
window
outer
outer
inner
outer
this
outer
inner
var o = {
value: 1,
outer: function () {
var inner = function (that) {
console.log(that); //bound to global object
};
inner(this);
}
};
o.outer();
出力しますouter
。
のouter
スコープthis
がオブジェクト自体 (つまりouter
) にバインドされているのは少しナンセンスではないでしょうか。バインディング)?inner
outer
this
outer
ECMAScriptの仕様では、関数コードの実行コンテキストに入るときに、«caller provided thisArg» がnullまたはundefinedのいずれかである場合this
、グローバル オブジェクトにバインドされると規定されています。
ただし、次のとおりです。
var o = {
outer: function () {
var inner = function () {
console.log('caller is ' + arguments.callee.caller);
};
inner();
}
}
オブジェクトouter
自体を出力します。
caller is function () {
var inner = function () {
console.log('caller is ' + arguments.callee.caller);
};
inner();
}
側面ではありますが、おそらく関連があることに注意してください。
厳密モードundefined
では、ウィンドウの代わりに最初のコードスニペットが出力されます。