変数のスコープは変数の可視性を指しますが、ライフサイクル (生存期間) は別の観点から変数を検査します。
JSの変数のスコープはグローバル変数とローカル変数に分けられ、関数内で定義されたものをローカル変数、関数外で定義されたものをグローバル変数と呼びます。 (「関数の外にあるものはグローバル変数と呼ばれます」は相対的なものです。ここで議論する前提は、var を使用して明示的に宣言された変数であるということです。関数内で var を使用せずに定義された変数は、デフォルトでグローバル変数です。もちろん、var を使用せずに変数を宣言することは嫌われます。 )。
次のようにコードをコピーします。
var glob = 4; // グローバル変数を関数の外で宣言します。
関数 fun() {
var height = 20; //関数内のvar宣言はローカル変数です。
Weight = 50; //関数内で var なしで宣言されたものはグローバル変数です
}
楽しい();
アラート(体重);
JS には、中括弧 {} で囲まれたブロックレベルのスコープはありません。 Javaにはあります。 mainメソッドに次のコードを記述します。
次のようにコードをコピーします。
public static void main(String... args) {
for(int i=0;i<5;i++) {
}
{
int j=10;
}
int z = 20;
System.out.println(i); // i が表示されない場合、構文解析中にエラーが報告されます。つまり、コンパイルは失敗します。
System.out.println(j); // j は表示されず、構文解析中にエラーが報告されます。つまり、コンパイルは成功しません。
System.out.println(z); // z が表示され、出力 20
}
しかし、JSの場合
次のようにコードをコピーします。
for(var i=0;i<5;i++) {
}
var obj = {名前:"リリー"};
for(obj の変数属性) {
}
{
var j=10;
}
alert(i);//出力 4、ブロックレベルのスコープなし
alert(attr); //出力名、ブロックレベルのスコープなし
alert(j);//出力 10、ブロックレベルのスコープなし
これは、グローバル スコープで変数を宣言する際に for ループを使用しないでください。そうしないと、グローバル名前付けスコープが汚染されてしまいます。
もちろん、JS1.7 は変数を宣言するための let キーワードを提案しました (https://developer.mozilla.org/cn/New_in_JavaScript_1.7 を参照)。これは for ステートメントのスコープにのみ適用されます。
次のようにコードをコピーします。
for(let i=0;i<5;i++) {
//todo
}
alert(i);//実行中にエラーが発生し、i が定義されていないことを示します
JS1.7 は次のように参照する必要があります <script type="application/javascript;version=1.7"/></script>
ps: firefox2+ は JS1.7 を実装します