7

これは私が答えを知っているべきだと確信しているものですが、私はただ愚かであるか、または私はこれまでにこれに出くわしたことがないかのどちらかです...

次の配列が与えられた場合、グローバルスコープで宣言されます。

var arr = [function() {
    console.dir(this);
}];

thisWindowオブジェクトを参照することを期待していました。ただし、関数を呼び出す場合:

arr[0]();​ //Logs Array

this実際にはアレイを参照しているようです。次に、関数への参照を別の変数に格納してそれを呼び出すと、Windowオブジェクトを参照しますthis

var func = arr[0];
func(); //Logs Window

では、なぜ関数のコンテキストが変わるのでしょうか。上記の2つのケースを示すフィドルがあります。

4

4 に答える 4

5

などのオブジェクトのプロパティとして関数を呼び出すとobj.func()thisはを参照しobjます。
これはまさにあなたがここでしていることです。arrはオブジェクトであり0、関数を保持するプロパティです。

注:結局のところ、配列は単なるオブジェクトであり、それらの要素はそれらのプロパティの値です(ただし、プロパティは通常、数値の文字列です(すべてのプロパティは文字列です))。

この場合の詳細については、MDN-thisを参照してください。

関数がオブジェクトのメソッドとして呼び出されると、その関数はメソッドthisが呼び出されたオブジェクトに設定されます。

2番目のケースでは、関数を「スタンドアロン」と呼びます。したがって、thisを参照しwindowます。ただし、コードが厳密モードで実行された場合は、にthisなりますundefined

于 2012-04-04T10:04:16.827 に答える
0

これは、thisキーワードが実際には、呼び出された関数の所有者(または所有者)への参照を返す演算子であるためです。最初のケースでは、ホルダーは配列(オブジェクト)であるため、配列を返します。2番目のケースでは、ホルダーはウィンドウオブジェクトです。

詳細については、この記事を参照してください。

于 2012-04-04T10:01:44.970 に答える
0

注意してください:

JavaScriptでは、this常に関数の所有者を指します。

あなたはquirksmodeでそれについてもっと読むことができます。

于 2012-04-04T10:02:13.497 に答える
0

要素は配列のメンバーであり、this 常に所有者オブジェクトを指しているためです(bind()//などで遊んでいる場合を除く)。オブジェクトの一部でない場合は、グローバルオブジェクトになります。これはブラウザ環境にあります。これの例外は、厳密モードの場合です。ここで、はになりますcall()apply()thiswindowthis undefined

あなたがしていることは事実上次と同じです:

var ar = {
    '0' : function () {
         console.dir(this);
     }
}

ar[0]();
var func = ar[0];
func();

...これは概念的にはもっと理にかなっているかもしれません。

http://jsfiddle.net/TVtwr/1/

于 2012-04-04T10:02:38.073 に答える