5

javascript に関するいくつかのドキュメントを読んでいて、次のコード例に出くわしました。

var o = {
  value: 1,
  outer: function () {
    var inner = function () {
      console.log(this);  //bound to global object
    };
    inner();
  }
};
o.outer();

を出力しますwindow

キーワードが親オブジェクト ( ) ではなくグローバル オブジェクト ( ) にバインドされている理由がわかりません。のスコープから アクセスする場合は、(それ自体を渡すのと同じように) をそのローカル関数に引数として渡す必要があります。したがって、予想どおり:thiswindowouter
outerinnerouterthisouterinner

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では、ウィンドウの代わりに最初のコードスニペットが出力されます。

4

2 に答える 2

6

これは、関数が定義されたときではなくthis、関数が実行されたときに設定されるためです。

例えば:

var o = {
    func: function(){
        console.log(this);
    }
};

を呼び出すときo.func()は、コンテキストoで実行しているため、期待どおりに機能します。

これを行うとしましょう:

var f = o.func;
f();

これは期待どおりに機能しません。これは、 を呼び出すときにf()コンテキストが関連付けられていないためthisですwindow

.callを使用して の値を変更することで、これを修正できますthis

var f = o.func;
f.call(o);  // sets `this` to `o` when calling it
于 2013-06-12T19:52:22.023 に答える