1

ここでは、アプリケーションのグローバル名前空間を作成しているだけで、すべてが期待どおりに機能します

var MYAPP = MYAPP || {} ; 

しかし、var キーワードを省略した場合 (正しい方法ではないことはわかっています)、javascript は "ReferenceError: MYAPP2 is not defined" というエラーをスローします。

MYAPP2 = MYAPP2 || {};

好奇心から、javascriptが参照を解決できない2番目のケースで誰かが私に説明してくれます。

4

3 に答える 3

2

最初のバージョンでは、Javascriptの変数の巻き上げによりエラーが発生しません。これは、次のバージョンと同等です。

var MYAPP;            // declares, but leaves the value undefined / unchanged
MYAPP = MYAPP || {};  // creates, if the value was previously undefined

重要なのは、これの宣言部分は、変数に対してすでに行われた既存の宣言または割り当てを上書きしないことです。

これにより、このパターンを単一のスコープ内で繰り返し使用できます。 MYAPPすでに持っていた値を保持するか、空のオブジェクトに初期化されます。

2番目のケースでは、その宣言ステップは事実上省略されます。変数がまだ宣言されていない場合(またはスコープ内に存在する場合、つまりグローバルオブジェクトのプロパティとして存在する場合)、表示されるエラーが生成されます。

于 2012-08-13T10:38:20.163 に答える
1

変数 MYAPP = MYAPP || {} は、現在のスコープ (別名実行コンテキスト) で変数 MYAPP を宣言します。宣言が関数内にある場合 - ローカル変数が宣言されています。グローバル スコープ内にある場合 - グローバル変数が宣言されます。

MYAPP2 = MYAPP2 || 一方、{} は単なるプロパティの割り当てです。まず、スコープ チェーンに対して MYAPP2 を解決しようとします。そのスコープ チェーンのどこかにある場合は、割り当てを実行します。MYAPP2 が見つからない場合にのみ、グローバル オブジェクト (スコープ チェーンの最上位オブジェクト) に x プロパティを作成します。

于 2012-08-13T10:37:08.863 に答える
0

varキーワードは、参照している変数をすぐに宣言します

var a = a || {}; 

のようなものです

var a; a = a || {};

2番目のケースでは、変数を参照しているのはまだ宣言されていません。

于 2012-08-13T10:41:15.613 に答える