javascript に関するいくつかのドキュメントを読んでいて、次のコード例に出くわしました。
var o = {
value: 1,
outer: function () {
var inner = function () {
console.log(this); //bound to global object
};
inner();
}
};
o.outer();
を出力しますwindow。
キーワードが親オブジェクト ( ) ではなくグローバル オブジェクト ( ) にバインドされている理由がわかりません。のスコープから
アクセスする場合は、(それ自体を渡すのと同じように) をそのローカル関数に引数として渡す必要があります。したがって、予想どおり:thiswindowouterouterinnerouterthisouterinner
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) にバインドされているのは少しナンセンスではないでしょうか。バインディング)?innerouterthisouter
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では、ウィンドウの代わりに最初のコードスニペットが出力されます。