7

単なる知的好奇心から、なぜjavascriptは受け入れますか

var z = z || [];

z を初期化する (z が最初に定義されているように)

ただし、var がないと、エラーがスローされます (グローバル空間で)

z = z || [];

(z が以前に定義されていない場合)

グローバル空間では、VAR を使用する必要はありませんが、悪い習慣かもしれません。

あなたが言う前に、これは次のような質問の複製です

var キーワードの目的は何ですか? また、いつ使用 (または省略) する必要がありますか?

「グローバルスコープにいる場合、違いはありません」という宣言に注意してください。

私の実際の例を考えると、明らかにそれは 100% 真実ではありません。

これは癖ですか、それとも正当なロジックはありますか?


私が学んだように答えの要約を追加します:

ティムのおかげで(以下を参照)、私の誤解の鍵はこれを認識していなかったことです(javascriptの基礎)

var z; z が既に存在する場合は何もしません

「var z」が常に初期化されると誤って仮定すると、この式は両方の方法でそれを持っているように見えます。

左から順に、「var z」は単に z が定義されていることを確認しますが、既存の値が既に存在する場合、実際には影響しません。右側では、z が既に存在する場合はそれが使用されます。そうでない場合は、変数が宣言されただけで (ただし空)、使用されませんが、エラーはスローされません。

これは、Javascript でのこの種のスコーピングと巻き上げの問題に関する優れた記事です: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

minitech および貢献してくれた他のすべての人に感謝します。

4

3 に答える 3

10

効果は正しいです。varは常にその「オペランド」をすぐに宣言しますが、宣言しない場合、スクリプトは未定義の変数を使用しようとしてエラーをスローします。

グローバルスコープにいる場合は、存在しない変数に割り当てることができ、それを宣言するのと同じ効果がありますが、それは悪い習慣かもしれません。もちろん、あなたの場合、それは未定義です。そうは言っても、それは知的好奇心からかもしれませんが、あなたは決して書くことはありません

var z = z || [];

そうするのは意味がないからです。むしろ、あなたはそうするかもしれません:

if(!window.z) {
    window.z = [];
}

。実際、グローバルスコープで物事を宣言するとき(これは決してありません) 、意図がより明確になるため、代わり;)に使用します。window.something

于 2012-01-30T16:04:55.803 に答える
6

z = z || []zスコープチェーンにないスコープ(グローバルかどうか)をスローします。zこれは、式が最初に右側で呼び出された既存の変数の値を取得しようとするためです。これは、存在しない場合はエラーになります。

var z = z || []エラーをスローしない理由はz、式が実行される前に変数が作成されるためです(まだ存在しない場合)。これは、一般にホイストと呼ばれる効果です。

一方、未解決の識別子(eg z = 2)に値を割り当てると、どのスコープでもエラーなしで機能します(ECMAScript 5の厳密モードでは、値を禁止してスローします)。識別子を解決できない場合は、スコープチェーンの最後のオブジェクト(グローバルオブジェクト)のプロパティとして追加されるため、グローバル変数を作成しているように見えます。

于 2012-01-30T16:34:15.660 に答える
4

宣言されていない変数に割り当てることができますz = 123; しかし、あなたはそれが何であるかを読もうとしないかもしれませんz = z || []

于 2012-01-30T16:08:10.123 に答える