C/C ++と比較して、ECMAScriptのFORループはローカルコンテキストを作成することはできません。
コードコピーは次のとおりです。
for({a:1、b:2}のvar k){
アラート(k);
}
アラート(k); //ループが終了したとしても、変数kはまだ現在のスコープにあります
いつでも、変数はVARキーワードを使用してのみ宣言できます。
上記の割り当て声明:
a = 10;
これは、単にグローバルオブジェクトの新しいプロパティを作成することです(ただし、変数ではありません)。 「変数ではない」とは、変更できないという意味ではなく、ECMAScript仕様の変数概念に準拠していないことを意味するため、「変数ではありません」(グローバルオブジェクトのプロパティになることができる理由は、JavaScriptにグローバルオブジェクトがあるためです。
問題を説明する簡単な例を見てみましょう
コードコピーは次のとおりです。
if(!( "a" in Window)){
var a = 1;
}
アラート(a);
まず、すべてのグローバル変数はウィンドウのプロパティであり、ステートメントvar a = 1です。 window.a = 1に相当します。
次の方法を使用して、グローバル変数が宣言されているかどうかを検出できます
ウィンドウ内の「変数名」
第二に、すべての変数宣言はスコープスコープの一番上にあります。同様の例をご覧ください。
コードコピーは次のとおりです。
アラート(ウィンドウ内の "a");
var a;
この時点で、宣言はアラートの後ですが、JavaScriptエンジンが最初にすべての変数宣言をスイープし、次にこれらの変数宣言を上部に移動するため、アラートがまだ真実です。最終的なコード効果は次のとおりです。
コードコピーは次のとおりです。
var a;
アラート(ウィンドウ内の "a");
第三に、質問の意味を理解する必要があるのは、変数宣言が進歩していることですが、変数の割り当てはそうではありません。このコード行には変数宣言と変数割り当てが含まれているからです。
ステートメントを次のコードに分割できます。
コードコピーは次のとおりです。
var a; // 声明
a = 1; //割り当てを初期化します
要約すると、可変宣言と割り当てが一緒に使用されると、JavaScriptエンジンは自動的に2つの部分に分割して、変数宣言を進めます。割り当てのステップは、コードの実行に影響を与え、予期しない結果を達成する可能性があるため、前進しません。
質問のコードは次のとおりです。
コードコピーは次のとおりです。
var a;
if(!( "a" in Window)){
a = 1;
}
アラート(a);
上記の例の分析によれば、変数が宣言されている場合、宣言されたローカル変数の前にVARを追加する必要があります。宣言されたグローバル変数の場合、VARを追加することはできません(グローバル変数の数を制限し、ローカル変数を使用しようとするのが最善です)
以下は、varを使用するいくつかの機能を説明しています
VARステートメントを使用して変数を複数回宣言することは、合法であるだけでなく、エラーを引き起こしません。
再利用宣言に初期値がある場合、割り当て声明としてのみ機能します。
再利用宣言に初期値がない場合、元の変数に影響はありません。
VAR宣言のない変数は、グローバル変数として存在します。 VAR宣言を持つ変数は、特に関数内のローカル変数に属します。また、テスト後、VARではないよりもVARで宣言する方が速い。安全かつ高速である関数でできるだけ多くのローカル変数を設定し、変数操作はより合理的であり、関数のグローバル変数のランダムな動作によって引き起こされる論理エラーはありません。
この速度は新しい方法よりもはるかに高速であるため、オブジェクトを宣言するときにオブジェクトの対面方式を使用することをお勧めします。
変数名は自分で撮影されます。セマンティクスと仕様の世話をするために、変数名はわずかに長くなる可能性がありますが、注意してください。変数名の長さもコードの実行速度に影響します。長い変数名宣言は、短いほど速くありません。