1

グローバル名前空間でローカル変数を定義すると、同じ名前のインスタンス変数によって上書きされます。

var outerVar;

outerVar = 'outerVar';
this.outerVar = 'thisOuterVar';
console.log(outerVar);            // thisOuterVar

ただし、関数内では同じことは起こりません。

var fun;

fun = function() {
  var innerVar;
  innerVar = 'innerVar';
  this.innerVar = 'thisInnerVar';
  return console.log(innerVar);      // innerVar
};

fun();

このコードは Firebug で実行されました。

this.constructor                  // Window { }

ノードの下で同じコードを実行すると、this.constructoris[Function: Object]は意味のある「thisOuterVar」ではなく「outerVar」を返します。

ウィンドウの下で動作が異なるのはなぜですか?

4

3 に答える 3

1

最初のサンプルのようにグローバル スペースからブラウザーでコードを実行すると、次のようになります。

var outerVar;

outerVar = 'outerVar';
this.outerVar = 'thisOuterVar';
console.log(outerVar);

次に、すべてが基本的なグローバル空間で実行されます: window- これは基本的に、ブラウザ js のすべての環境の基本スコープです。

したがって、 value like を定義するvar outerVarと、基本的にwindow.outerVarorthis.outerVarまたはのようになりますwindow['outerVar']

しかし、次のような匿名関数/オブジェクト関数の下でコードを実行すると:

fun = function() {
  var innerVar;
  innerVar = 'innerVar';
  this.innerVar = 'thisInnerVar';
  return console.log(innerVar);      // innerVar
};

this関数 (オブジェクト) への参照var innerVarと関数のスコープへの参照 (基本的な oop クラスのプライベート var のように) これthis.somevarパブリックvar othervarありプライベートであると見なすことができます- これらは完全に別のものです。

ノードではすべてが「舞台裏で」匿名関数の下で実行されるため、これはノードの質問にも答えます-これはcommonjsの方法です-ノードでは基本的に匿名関数サンプルと同じです。

編集: @bfavarettoが私に正しくコメントしたthis.innerVarように-使用方法に従って定義されます-つまり、通常の関数として使用する場合、もちろんthisウィンドウになります-したがって、グローバル-オブジェクトを作成する場合(私が思ったように-インスタンスに定義され、「public」になります):

function func(){
   alert(this);
}

func(); //alerts 'window'

var f = new func(); //alerts 'object'
于 2013-04-24T19:11:49.027 に答える
0

グローバル名前空間では、「a = 5;」'window.a = 5;' または 'this.a = 5;' と意味的に同等です。

于 2013-04-24T19:08:34.320 に答える
0

「グローバル名前空間でローカル変数を定義すると...」とあなたは言いました。それは言葉の矛盾です。あなたがグローバルスコープにいるとき、「ローカル変数」のようなものはありません。関数内で何が起こっているかについては、宣言するvar innerVar;と、その関数のスコープ内にのみ存在する変数が作成されます。次に、関数内で変更すると、その時点で何が起こってもthis.innerVar変数を変更 (または宣言) します。この場合は、基本的にはグローバル スコープです。innerVarthiswindow

于 2013-04-24T19:12:40.210 に答える