4

thisキーワードは常に、包含関数がメソッドであるオブジェクトを参照します。」

素晴らしい、十分に単純に聞こえますが、これが私が疑問に思っていることです...

例えば:

function func1() {

  function func2() {
    alert(this == window); // true
  }

  func2();

  alert(this == window); // true
}

func1.func3 = function () {

  alert(this == window); // false
  alert(this == func1); // true

};

func1();
func1.func3();

さて、これfunc1は実際にはグローバル( )オブジェクト(グローバルwindowオブジェクトのプロパティfunc1に割り当てられた関数オブジェクト)のメソッドであるため、 insideがグローバルオブジェクトを参照することは理にかなっています。また、の関数オブジェクトのメソッドであるため、理にかなっています。その内部はの関数オブジェクトを参照します。thisfunc1func3func1thisfunc3func1

気になるのはfunc2thisネストされた関数の内部もグローバルオブジェクトを参照することになっていることは知っていますが、それがグローバルfunc2オブジェクトのメソッドではないため、理由はわかりません。私が理解している限り(そしてこれは私が完全に間違っているかもしれない部分です) 、の呼び出し(アクティブ化/変数)オブジェクトのメソッドです。さて、私がこれについて正しい場合(そして私が正しいかどうかわからない場合) 、グローバルオブジェクトの代わりにの呼び出しオブジェクトを内部で参照するべきではありませんか?func2func1thisfunc2func1

だから、私の質問は次のようになると思います:ネストされた関数は、ネストされた関数の呼び出し(アクティブ化)オブジェクトのメソッドですか?もしそうなら、グローバルthisオブジェクトの代わりにその呼び出しオブジェクトを参照するべきではありませんか?

4

3 に答える 3

5

thisキーワードは常に、包含関数がメソッドであるオブジェクトを参照します。

いいえ。残念ながら、そのように簡単ではありません。MDNのキーワードドキュメントには、this概要が記載されています。関数がメソッドとして呼び出されたときにオブジェクトに設定されますが、の可能性もあります。デフォルトではthis、andundefinedを使用する場合のように、特別なことを何もせずに呼び出されます。ずさんな(非厳密な)モードの場合、関数(および)は使用されませんが、その場合は(ブラウザー内の)グローバルオブジェクトを指します-観察しているものです。func1func2undefinednullthiswindow

ただし、関数がコンストラクターとして(キーワードを使用して)呼び出された場合は新しいオブジェクトインスタンスを指しnew、ハンドラーとして使用された場合はイベントターゲット(DOM要素など)を指すこともあります。call最後になりましたが、applyまたはbind…</p> を使用して手動で設定できます。

this入れ子とは何の関係もありません。入れ子関数の宣言/式は、変数のスコープ(「プライバシー」、可用性)にのみ影響します。関数の可変スコープは変更されませんが、の値はthis呼び出しごとに異なる可能性があります。これは、追加の引数のようなものです。

于 2012-09-13T16:39:58.040 に答える
3

関数内のキーワードの意味はthis、関数が呼び出される方法によって異なります。JavaScriptには4つの異なる関数呼び出しパターンがあります。

  1. 関数呼び出しパターンfoo()
  2. メソッド呼び出しパターンo.foo()
  3. constructor invocation pattern new foo
  4. call/apply pattern foo.apply(...) or foo.call(...)

Only in #2 is it the case that this inside the function refers to the object of which the function is a method.

You are invoking func2() with the function invocation pattern. When doing so, this refers to the global object.

As suggested by @Bergi, see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this for more detail on the meaning of this and the different function invocation patterns.

于 2012-09-13T16:52:59.167 に答える
1

しかし、func2はグローバルオブジェクトのメソッドではないため、理由はわかりません。

関数内で定義されたものはすべて、その関数のスコープに対してローカルです。したがってfunc2、のローカルスコープに属しているため、にfunc1アタッチされていませんwindow

Javascriptでは、の値thisは通常、関数の呼び出し方法に基づいています。先頭のオブジェクトなしで関数を呼び出すと、this通常はグローバルな親オブジェクトである。に設定されますwindow

の値はthis、次の3つの方法で明示的に設定できます。

myObj.func(a, b); //this set to myObj implicitly because myObj is the parent 

func.call(myObj, a, b); //this set to myObj explicitly; the first argument 
                        //to call sets the value of this for that function

func.apply(myObj, [a, b]); //this set to myObj explicitly; the first argument
                           //to apply also sets the value of this for that
                           //function.

thisトリッキーな概念になる可能性があります。MDNにはについての良い記事thisがあります。

于 2012-09-13T16:32:47.650 に答える