問題を説明するために簡単な例を見てみましょう
if (!("a" in window)) { var a = 1; } alert(a);
まず、すべてのグローバル変数は window の属性です。ステートメント var a = 1; は window.a = 1; と同等です。次のメソッド グローバル変数が宣言されているかどうかを確認します
ウィンドウ内の「変数名」
次に、すべての変数宣言がスコープの先頭にあります。同様の例を見てください:
コードは次のとおりです。 alert("a" in window);
var a;
var a; alert("a" in window);
第三に、この質問の意味は、変数宣言は進められていますが、変数代入はそうではないということであることを理解する必要があります。これは、このコード行には変数宣言と変数代入が含まれているためです。
ステートメントは次のコードに分割できます:
var a; //声明 a = 1; //初始化赋值
要約すると、変数の宣言と割り当てが一緒に使用される場合、JavaScript エンジンは自動的に 2 つの部分に分割して、事前に変数を宣言し、変数を代入しません。コードの実行に影響を与え、予測できない結果が生じる可能性があるため、このステップは進められます。
質問内のコードは次と同等です:
var a; if (!("a" in window)) { a = 1; } alert(a);
上記の質問例の分析によると、変数を宣言するとき、それがローカル変数の場合は、その前に var を追加する必要があります。グローバル変数、var を追加する必要はありません (グローバル変数の数を制限するのが最善です、ローカル変数を使用するようにしてください)
var の使用のいくつかの機能を次に示します
var ステートメントを使用して変数を宣言する複数回実行することは合法であるだけでなく、エラーも発生しません。
再利用された宣言に初期値がない場合、元の既存の変数には影響しません。
var 宣言のない変数はグローバル変数として存在し、var 宣言のある変数は、特に関数内でローカル変数になります。さらに、テスト後、var を使用した宣言は、var を使用しない場合よりも高速です。関数内でできるだけ多くのローカル変数を設定すると、関数内のグローバル変数のランダムな操作によって変数の操作がより合理的になり、安全かつ高速に実行できます。
オブジェクトを宣言するときは、新しいメソッドよりもはるかに高速な、オブジェクトの self-face メソッドを使用するのが最善です。
変数名はセマンティクスと仕様に配慮するために自分で選択しますが、変数名の長さはコードの実行速度にも影響することに注意してください。長い変数名の宣言は、短い変数名ほど速く実行されません。
問題は次のとおりです: 2 つのアラートの出力結果は何ですか?
<script type="text/javascript"> var a = 1; var a; alert(typeof a); (function () { b = '-----'; var b; })(); alert( typeof b); </script>
Chromeでコードを実行すると、コードの正しい結果は1.数値2.未定義です。ここで検討するのはJavaScriptの変数宣言の事前宣言の概念です。
次のような別の例を見ていきます:
test(); function test(){ alert("Hello World!"); }
プログラムはエラーを報告しませんが、実行結果は次のようになります: Hello World!。原則: コンピューターはステートメントの実行を開始する前に、まずすべての関数定義を検索し、次に関連する関数を保存します。
質問 1:var a = 1;
var a;
2 行目で変数 a を宣言することは、先頭で a を宣言することと同じで、最初の文は a を再宣言してから値を 1 に代入することになります。したがって、typeof a は数値です
質問 2:
b = '-----';
質問 2 の分析: b='-----'、プログラムは最初に変数があるかどうかを調べます。コンテキスト内 b の宣言 (存在する場合) には、値 '-----' が直接割り当てられます。ただし、alert(typeof b); は関数の外にあり、グローバル変数 b を出力しますが、これらはすべて未定義です。
注意: 変数への代入は事前には行われません。
以上がJavaScript の変数宣言と変数 var の定義に関するさまざまな理解と分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。