js總是可以在不知不覺中地創建了全局變數,其原因在於JavaScript的兩個特性。 1.JavaScript可直接使用變數,甚至無需聲明; 2.JavaScript有個暗示全局變數的概念,即任何變數,如果未經聲明,就為全局對象所有(也就像正確聲明過的全局變數一樣可以訪問)。 在這個例子中,resu ...
js總是可以在不知不覺中地創建了全局變數,其原因在於JavaScript的兩個特性。
1.JavaScript可直接使用變數,甚至無需聲明;
2.JavaScript有個暗示全局變數的概念,即任何變數,如果未經聲明,就為全局對象所有(也就像正確聲明過的全局變數一樣可以訪問)。
function sum(x,y){
//反模式:暗示全局變數
result=x+y;
return result;
}
在這個例子中,result未經聲明就使用了。代碼雖然在一般情況下可以正常工作,但如果在調用該函數後,在全局命名空間使用了另外的result變數,問題就會出現。此函數中的ruslt變數為全局變數。
另一種創建飲食全局變數的反模式是帶有var聲明的鏈式賦值。在下麵的代碼中,a是去不變數,b是全局變數。
//反模式,不要使用
function foo(){
var a=b=0;
//...
}
避免全局變數的另一個原因在於代碼移植,如果你希望你的代碼運行在不同的環境中(主機),使用全局變數就會非常危險。因為可能很偶然地,不存在與原環境(所以看起來非常安全的),但存在於其他環境的主句變數就被覆蓋了。
for迴圈
for迴圈經常用在遍曆數組或類數組對象,如引數(arguments)和HTML容器對象。通常for迴圈模式使用如下。
//次優迴圈
for(var i=0;i<marggay.length;i++){
//對ayarray[i]做操作
}
這種模式的問題在於每次迴圈迭代是都要訪問數據的長度。這樣會是代碼變慢,特別是當ayarray不是數據,而是HTML容器對象時。容器的麻煩在於它們在document (HTML頁面)下是活動的查詢。也就是說,每次訪問任何容器的長度時,也就是在查詢活動的DOM,而通常DOM操作是非常耗時的。
所以一般好的for迴圈模式是將已經遍歷過的數組(或容器)的長度緩存起來。
for(var i = 0, max = myarray.length; i < max; i++){
//對myarray[i]進行處理
}
這種方式下,對長度的值只提取一次,但應用到整個迴圈中。