2

Javascript-Garden から:

Foo.method = function() {
  function test() {
    //this is set to the global object
  }
test();
}

テスト内から Foo にアクセスするには、Foo を参照するメソッド内にローカル変数を作成する必要があります。

Foo.method = function() {
  var that = this;
  function test(){
    //Use that instead of this here
  }
test();
}

誰でもこれを説明できますか?私が理解している限りthis、グローバルスコープで呼び出された場合、グローバルオブジェクトを参照します。しかし、ここでは、メソッド内にある関数内で呼び出されます (最初の例)。2 番目の例では参照していないのに、グローバル オブジェクトを正確に参照しているのはなぜですか?

4

3 に答える 3

5

私が理解している限り、グローバル スコープで呼び出された場合、これはグローバル オブジェクトを参照します。

関数が明示的なコンテキストなしで呼び出された場合、 No this. はデフォルト オブジェクトを参照します。範囲は無関係です。(strict モードでは、undefined代わりに を参照します)。

グローバルオブジェクトを正確に参照するのはなぜですか

それが何を指しているのかはわかりません。の値は、関数の定義方法ではなく、関数の呼び出しthis方法によって決まります。

例を更新すると、コンテキストなしで呼び出されることがわかります。そのため、this(内部関数では) がデフォルト オブジェクトになり、Web ブラウザーではwindow(undefined厳密モードになります)。

2番目の例はそうではありませんか?

2 番目の例では、内部関数は使用されませんthis(前の例と同じ値になります)。

2 番目の例ではthat代わりに使用しています。thatは外側の関数のスコープで定義され、thisその関数が呼び出されたときに の値が何であれ設定されます。

Foo.method()関数がthen (outer) this(したがってthat)として呼び出されると仮定するのはFoo、それが呼び出されたコンテキストであるためですmethod

于 2013-04-03T09:17:55.670 に答える
3

thisは、関数を定義するときに設定されません。関数呼び出しの受信者に対してのみ動的に定義されます。

を呼び出すとfoo.test()thisintestになりますfoo

しかし、もしそうなら

var f = foo.test;
f();

thisin f(つまり)はfoo.test外部オブジェクト (ルート レベルで実行している場合はウィンドウ) になります。

と同じだろう

foo.test.call(window);
于 2013-04-03T09:14:21.093 に答える
0

2 番目の例では、クロージャーを使用して、外側の関数変数を内側の関数のスコープ チェーンに配置します。

Foo.method = function() {
  var that = this;
  function test(){
    //This function has access to the outer variables scope chain.
  }
}
于 2013-04-03T09:16:15.983 に答える