次のコードがある場合:
var global = this;
function A () {
function B () {
return this;
}
return B();
}
var C = new A();
C === global // true
in 関数 Bがオブジェクト A の ではthisなくグローバル空間を参照するのはなぜですか?this
次のコードがある場合:
var global = this;
function A () {
function B () {
return this;
}
return B();
}
var C = new A();
C === global // true
in 関数 Bがオブジェクト A の ではthisなくグローバル空間を参照するのはなぜですか?this
の値はthis、関数呼び出しごとに決定されます。Bはコンテキストなしで呼び出されるため、 の値thisはグローバル オブジェクトです。
this単純にコピーするだけで、外部コンテキストに保存できます。
function A() {
var x = this;
function B() {
return x;
}
return B();
}
thisスコープとは関係ありません。変数ではありません。これは、現在実行中の関数のオブジェクト コンテキストに評価されるキーワードです。関数のオブジェクト コンテキストは、呼び出し方によって決まります。関数がどこでどのように定義されているかは問題ではありません。
そのような関数を呼び出すと、fn()それはオブジェクト コンテキスト内になく、単に .xml を見ただけでエラーをスローする必要があるときに、言語が誤って回避しようとしますthis。これは、 と評価される厳密モードでは多少修正されていundefinedます。
オブジェクトIEのプロパティとして関数を呼び出すと、そのobj.fn()呼び出しobjにバインドさthisれます。
呼び出しに適切なオブジェクト コンテキストを取得するためだけに関数をオブジェクトにアタッチするのは面倒なので、すべての関数.callは、オブジェクト コンテキストを明示的に指定できるメソッドを継承します。
return B.call(this);
Pointy の正解に付随するもの:
この理由は、関数を使用してやりたいことが何でもできるからです。関数 A から関数 B を返し、それをグローバル変数として保存できます。
または、関数 B をメソッドとしてオブジェクトまたは多数のオブジェクトに追加することもできます。または、AJAX コールバックで使用したり、タイマーからのコールバックとして使用したりできます。
エンジンは関数 B で何が起こるかわからないため、this関数が呼び出された時点で、関数が呼び出されているものは何でも参照すると言語は言います。
これにより、言語に多くのダイナミズムが追加されますが、特定の時点で「これ」が何を指しているのかわからない場合、多くの頭痛の種も追加されます。
経験則:
関数がオブジェクトのメソッドとして直接.callアタッチされている場合、または関数がまたはで呼び出され、 のように.applyコンテキストが与えられている場合、はを参照します。myFunc.call(myObj)thiswindow