17

外部関数が直接呼び出されたときに内部関数が外部関数のパブリック プロパティにアクセスできるのに、変数に割り当てられたときにはアクセスできない理由を理解しようとしています。

例:

function outer(x,y){

    this.x = x;
    this.y = y;

    function inner(){
        alert(this.x);       
    }

    inner();
}

outer(1,2); //As expected, alerts 1
var func = outer(1,2) //Also alert 1
var func2 = new outer(1,2); //Alerts undefined

私が試したことの1つは、thisキーワードを削除するalert(this.x);ことで、3つのケースすべてで機能しました. ただし、thisキーワードを削除すると、パブリック変数ではなく、渡されたパラメーターにアクセスすることになり、これは明らかに望ましいアクションではありません。誰かがこの動作を説明できますか?

4

2 に答える 2

21

outer(1, 2)そのように呼び出すthisと、 への参照にwindowなるため、「x」と「y」は実質的にグローバル変数です。そのため、inner()「x」にアクセスできます。

呼び出すnew outer(1, 2)と、this(「外側」で) が新しいオブジェクトへの参照になります。"inner" が "outer" 内で呼び出された場合thisでも が参照されるwindowため、"x" はありません。

の値は関数呼び出しごとにthis決定され、値はその呼び出しの詳細のみに依存します。したがって、「outer」を介して呼び出すという事実は、「inner」への内部呼び出しには影響しません — 関数を as として呼び出すだけなので、その関数内の値は(まあ、グローバルコンテキスト、それが何であれ)への参照になります。は)。newinner();thiswindow

this関数の呼び出し時に設定できる方法は次のとおりです。

  1. 関数がnew演算子を介して呼び出されるとthis、新しく作成されたオブジェクトが参照されます。
  2. 関数への参照がオブジェクト ( foo.someFunction())のプロパティ ルックアップによって取得された場合、thisはそのオブジェクトへの参照になります。
  3. .call()Function プロトタイプを介して、または.apply()Function プロトタイプから関数が呼び出された場合、this使用された関数の最初の引数が参照され、必要に応じてオブジェクト値に強制されます。
  4. 関数が単純な「裸の」参照を介して呼び出された場合this、グローバル コンテキスト (windowブラウザ内) を参照します。編集— Šime Vidas は上記のコメントで、strict モードでは、この場合は be になると指摘していますthis(nullこれは実際にはもう少し理にかなっていて、OP で見られる奇妙さを回避できます)。
于 2012-08-23T13:23:49.750 に答える
8

Javascript で関数を使用する方法は 4 つあります。それぞれの機能は、の内容を変更することthisです。

  • 関数呼び出し: this = グローバル オブジェクト (ブラウザのウィンドウ)
  • メソッド呼び出し: this = 呼び出し元のオブジェクト。
  • コンストラクター呼び出し: this = 作成している新しいオブジェクト。
  • call/apply 呼び出し: this = あなたが渡したオブジェクト。

あなたの場合this == window、関数を直接呼び出す場合 ( outer()) ですが、 new ( new outer()) を使用して呼び出すと、作成している新しいオブジェクトになります。

基本的にここに書いたこと

于 2012-08-23T13:27:38.980 に答える