JavaScript には独自のこのメカニズムのセットがあり、状況に応じて、このメカニズムのポイントも異なります。
グローバルスコープ
console.log(this); //全局变量
グローバル スコープはこれを使用して、ブラウザ環境のウィンドウであるグローバル変数を指します。
注: ECMAScript5 の厳密モードにはグローバル変数がなく、ここでは未定義です。
関数呼び出し
function foo() { console.log(this); } foo(); //全局变量
この関数呼び出しもグローバル変数を指します。
注: ECMAScript5 の厳密モードにはグローバル変数がなく、ここでは未定義です。
オブジェクトメソッド呼び出し
var test = { foo: function () { console.log(this); } } test.foo(); //test对象
オブジェクト メソッド呼び出しでは、これは呼び出し元を指します。
var test = { foo: function () { console.log(this); } } var test2 = test.foo; test2(); //全局变量
ただし、この遅延バインディング機能により、上記の例では、これはグローバル変数を指します。これは、関数を直接呼び出すことと同じです。
これは非常に重要です。同じコードセグメントは
を実行するときにのみ決定できます。コンストラクター
function Foo() { console.log(this); } new Foo(); //新创建的对象 console.log(foo);
コンストラクター内で、これは新しく作成されたオブジェクトを指します。
これを明示的に設定します
function foo(a, b) { console.log(this); } var bar = {}; foo.apply(bar, [1, 2]); //bar foo.call(1, 2); //Number对象
Function.prototype の call または apply メソッドを使用する場合、関数内の this は渡される最初のパラメーターとして設定されます。