ホームページ >ウェブフロントエンド >jsチュートリアル >Javascript学習ノート - 機能編(2):この仕組み_基礎知識
グローバルスコープ内
これ;
これがグローバル スコープで使用される場合、グローバル オブジェクトを指します。
ここでは、グローバル オブジェクトについて詳しく説明します:
グローバル オブジェクトは、実行コンテキストに入る前に作成されたオブジェクトです。
このオブジェクトのコピーは 1 つだけあり、そのプロパティにはプログラム内のどこからでもアクセスできます。グローバル オブジェクトのライフサイクルは、プログラムが終了した時点で終了します。
グローバル オブジェクトの最初の作成フェーズでは、Math、String、Date、parseInt が独自の属性として使用され、他の属性も初期化されます (グローバル オブジェクト自体を指すこともできる) 追加で作成された他のオブジェクトを持つこともできます。 。たとえば、DOM では、グローバル オブジェクトの window プロパティはグローバル オブジェクト自体を参照できます。
したがって、コンソールで window と入力するのは this.window と同じです。
関数呼び出し時
foo();
ここでも、これはグローバル オブジェクトを指します。
メソッド呼び出し時
test.foo();
この例では、これはテスト オブジェクトを指します。
コンストラクターを呼び出す場合
新しい foo();
キーワード new を使用して関数が呼び出される場合、それをコンストラクターと呼びます。このとき、関数内では、thisは新しく作成されたオブジェクトを指します。
明示的に設定した場合
function foo(a, b, c) {}// var bar = {}; foo.apply(bar, [1, 2, 3]); // array will expand to the below foo.call(bar, 1, 2, 3); // results in a = 1, b = 2, c = 3
Function.prototype の apply メソッドと call メソッドを使用する場合、this の値はメソッドの最初のパラメーターとして明示的に設定されます。
したがって、関数を呼び出すときのルールとは異なり、上記の例ではこれは bar を参照します。
呼び出しメソッドと適用メソッドは次のとおりです:
メソッド を呼び出す:
構文: call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義: オブジェクトのメソッドを呼び出して、現在のオブジェクトを別のオブジェクトに置き換えます。
メソッド を適用します:
構文: apply([thisObj[,argArray]])
定義: オブジェクトのメソッドを適用して、現在のオブジェクトを別のオブジェクトに置き換えます。
ここで注意すべき点の 1 つは、オブジェクトが文字通りに宣言されている場合、これをオブジェクト自体を指すために使用することはできないということです。以下のように:
var obj = {me: this}
ここでは、this は obj を指しません。また、this の適用は上記の 5 つの状況に限定されます。
概要
上記の状況はほとんどの場合意味がありますが、2 番目の状況 (つまり、関数を呼び出すとき) では、これが実際にはほとんど役に立ちません。これは、JavaScript 設計におけるもう 1 つの間違いであると考えられます。
Foo.method = function() { function test() { // this is set to the global object } test(); }
上で述べたとおり、ここでは Foo 関数ではなくグローバル オブジェクトを指します。
テストで Foo にアクセスするには、メソッド内に Foo を指すローカル変数を作成する必要があります。
Foo.method = function() { var that = this; function test() { // Use that instead of this here } test(); }
これは単なる通常の変数名ですが、外部の this を指すためによく使用されます。
関数のエイリアスに関連するもう 1 つの興味深い場所があります。それは、メソッドを変数に割り当てるときです。
var test = someObject.methodTest; test();
上記の例では、test は通常の関数として扱われるため、2 番目のケース (つまり、関数を呼び出すとき) に従って、その内部の this は someObject ではなくグローバル変数を指します。
この遅延バインディングは、最初は間違った決定のように見えるかもしれませんが、実際には、これがプロトタイプ継承の仕組みの基礎です。
function Foo() {} Foo.prototype.method = function() {}; function Bar() {} Bar.prototype = Foo.prototype; new Bar().method();
この時点で、メソッドが呼び出されるとき、メソッドは Bar のインスタンス オブジェクトを指します。