在JS中,是沒有塊級作用域的
舉兩個個例子:
if語句塊:
if (true){ var name='Ling'; } alert(name);
輸出:Ling
for語句塊;
for(var i=0;i<10;i++) { var name='Ling'; } alert(i); alert(name);
輸出:10
輸出:Ling
也就是說最後的結果都是window下全局變量:
alert(window.i); alert(window.name);
在Javascript的函數體中,有下面幾種情況需要註意:
1、有無Var
如果有Var,在函數內部聲明變量是局部變量,如下例,讀取不到name的數據。
function box(){ var name ='Ling'; } alert(name);
如果把var去掉的話,那麼就會輸出:Ling,此時聲明的變量為全局變量。在寫代碼的過程中,不適用var就初始變量的話,會有很多意外發生,所以初始變量的時候一定要加上var。
2、全局變量和局部變量命名相同
var scope="global"; function t(){ alert(scope); var scope="local" alert(scope); }
最終的輸出結果是:
undefined
local
為什麼會出現這樣的結果?因為:
javascript 變量范圍
(1)全局變量的作用域是全局性的,即在整個Javascript程序中,全局變量作用處處都存在。定義在”script”塊中,在”function”函數外。
(2)局部變量的作用域是局部性的,在函數內部或函數參數時定義,作用范圍是從函數開始到結尾(註意此處說法)
(3)在函數內部,局部變量的優先級比同名的全局變量優先級要高;如果存在與全局變量名稱相同的局部變量(包括參數),那麼該全局變量將不再起作用。
原來是這個原因。不知道你看明白瞭沒有~~
那麼當全局變量和局部變量重名時,怎麼解決這個問題呢?
哈哈~~最簡單的當然就是避免全局變量和局部變量相遇咯~~
還有另外一種方法,window對象的所有屬性擁有全局作用域,用window.全局變量名,如下:
var scope="global"; function t(){ alert(window.scope); var scope="local" alert(scope); }
至此,問題也就說完瞭。
總結
上面的問題其實也反映的另一個問題,命名規范的問題,如果命名不規范,就會出現很多意想不到的問題,所以,花點時間上網查查幾種不同的命名的規范,這樣能在你編寫代碼的時候減少不必要的麻煩。