變數的作用域指的是變數的可見性,而生命週期則(存活期)則是從另一個角度考察變數。
JS中變數的作用域分為全域變數和局部變量,函數內定義的稱為局部變量,函數外的稱為全域變數。 (「函數外的稱為全域變數」是相對的,另此處討論的前提是用var明確聲明的變量,函數內不用var定義的變數預設是全域變量,當然忽略var聲明變數是不贊成的)。
var glob = 4;//函數外宣告全域變數
function fun() {
var height = 20; //函數內用var宣告的是局部變數
weight = 50; //函數內不用var宣告的是全域變數
}
fun();
alert(weight);
JS中沒有區塊級作用域,即用大括號{}包含的。 Java中則有。在main方法中寫入下程式碼
public static void main static void (String... args) {
for(int i=0;i }
{
= 20;
System.out.println(i); // i不可見,語法分析時報錯,即編譯不通過
System.out.println(j); // j不可見,語法分析時報錯誤,即編譯不透過
System.out.println(z); // z可見,輸出20
}
但若在JS
for(var i=0;i}
var obj = {name:"Lily"};
for(var attr in obj) {
}
{
var j=10;
}
alert( i);//輸出4,沒有區塊級作用域
alert(attr); //輸出name,沒有區塊級作用域
alert(j);//輸出10,沒有區塊級作用域
這也說明一個問題,避免在全域範圍內使用for循環同時宣告變量,否則會造成全域命名範圍的污染。
當然,JS1.7中提出了let關鍵字宣告變數(見https://developer.mozilla.org/cn/New_in_JavaScript_1.7),只作用於for語句範圍。
for(let i=0;i //todo
}
alert(i);//運行時弄錯,提示i未定義
JS1.7需要這樣引用
ps:firefox2 實作了JS1.7