全局變量的問題
全局變量的問題在于,他在你的所有代碼或者一個頁面中都共享。他們在同一個命名空間下面,這通常會造成變量名沖突–兩個同名的變量,但是確實不同的用處。
通常在一些頁面中需要引入一些其他人的代碼,比如:
- 第三方的JS庫
- 廣告伙伴的腳本
- 第三方的用戶行為分析或者統(tǒng)計腳本
- 不同的組件、按鈕等等
加入其中一個第三方組件定義了一個全局變量:result。然后在你的程序中,也定義了一個全局變量result。最后的這個result會覆蓋點之前的result,這樣第三方的腳本就會停止工作。
所以,為了對其他的腳本友好,在一個頁面中使用越少的全局變量越好。在后面會有一些方法來告訴你如何減少全局變量,比如使用命名空間,或者自執(zhí)行的匿名函數(shù),但是最好的避免全局變量的方法就是使用var關(guān)鍵字來聲明變量。
因為javascript的兩個特性,創(chuàng)建一個全局變量非常的簡單。第一,你可以使用一個甚至沒有聲明的變量,第二,在javascript中,所有未聲明的變量都會成為全局對象的一個屬性(就像一個聲明了的全局變量一樣)?纯催@個例子:
function sum(x,y){ result = x + y; return result; }
在這個代碼中,result在沒有被聲明的情況下就被使用了,這個代碼也能很好的工作,但是在調(diào)用了這個函數(shù)之后,就會多一個名為result的全局變量,這是所有問題的根源了。
解決這個問題的辦法就是使用var:
function sum(x,y){ var result = x + y; return result; }
兩外一個不好的習(xí)慣就是在聲明變量的時候使用鏈?zhǔn)降姆椒▉碣x值,這時候,a是局部變量,但是b就成為了全局變量。
function foo(){ var a=b=0; .... }
這是因為,b = 0這個表達式先執(zhí)行,執(zhí)行的時候b并沒有被聲明,所以b就成為了全局變量,然后返回這個表達式的值0,給聲明了的變量a,換句話說,就好像你輸入的是:
var a = (b=0);
如果你已經(jīng)聲明變量,那么這種鏈?zhǔn)降馁x值沒有問題:
function foo(){ var a,b; ... }
另外一個避免使用全局變量的原因是考慮到程序的可移植性。如果你想讓你的代碼在不同的環(huán)境中都可以工作,那么使用全局變量就很可能會與新的系統(tǒng)中的全局變量沖突(或許在之前的系統(tǒng)中沒有問題)。
出處:rockux
責(zé)任編輯:bluehearts
上一頁 如何編寫高質(zhì)量的Javascript代碼 [1] 下一頁 如何編寫高質(zhì)量的Javascript代碼 [3]
◎進入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|