變量作用域
JavaScript中的許多問題都來自于變量作用域:要么認為局部變量是全局的,要么用函數(shù)中的局部變量覆蓋了全局變量。為了避免這些問題,最佳方案是根本沒有任何全局變量。但是,如果你有一堆,那么你應(yīng)該知道這些陷阱。
不用var關(guān)鍵字聲明的變量是全局的。記住使用var關(guān)鍵字聲明變量,防止變量具有全局作用域。在下面例子中,在函數(shù)中聲明的變量具有全局變量,因為沒有使用var關(guān)鍵字聲明:
anonymousFuntion1 = function(){ globalvar = 'global scope'; //全局聲明,因為“var”遺漏了 return localvar; }(); alert(globalvar); //彈出“global scope”,因為函數(shù)中的變量是全局聲明
anonymousFuntion2 = function(){ var localvar = 'local scope'; //使用“var”局部聲明 return localvar; }(); alert(localvar); //錯誤 “l(fā)ocalvar未定義”。沒有全局定義localvar
作為參數(shù)引進到函數(shù)的變量名是局部的。如果參數(shù)名也是一個全局變量的名字,像參數(shù)變量一樣有局部作用域,這沒有沖突。如果你想在函數(shù)中改變一個全局變量,這個函數(shù)有一個參數(shù)復(fù)制于這個全局變量名,記住所有全局變臉都是window對象的屬性。
var myscope = "global"; function showScope(myscope){ return myscope; //局部作用域,即使有一個相同名字的全局變量 } alert(showScope('local'));
function globalScope(myscope){ myscope = window.myscope; //全局作用域 return myscope; } alert(globalScope(’local’));
你甚至可以在循環(huán)中聲明變量:
for(var i = 0; i < myarray.length; i++){}
覆蓋函數(shù)/重載函數(shù)
當你不止一次的聲明一個函數(shù)時,這個函數(shù)的最后一次聲明將覆蓋掉該函數(shù)的所有前面版本且不會拋出任何錯誤或警告。這不同于其他的編程語言,像Java,你能用相同的名字有多重函數(shù),只要它們有不同的參數(shù):調(diào)用函數(shù)重載。在JavaScript中沒有重載。這使得不能在代碼中使用JavaScript核心部分的名字極其重要。也要當心包含的多個JavaScript文件,像一個包含的腳本文件可能覆蓋另一個腳本文件中的函數(shù)。請使用匿名函數(shù)和名字空間。
(function(){ // creation of my namespace 創(chuàng)建我的名字空間 if(!window.MYNAMESPACE) { window['MYNAMESPACE'] = {}; } //如果名字空間不存在,就創(chuàng)建它 //這個函數(shù)僅能在匿名函數(shù)中訪問 function myFunction(var1, var2){ //內(nèi)部的函數(shù)代碼在這兒 } // 把內(nèi)部函數(shù)連接到名字空間上,使它通過使用名字空間能訪問匿名函數(shù)的外面 window['MYNAMESPACE']['myFunction'] = myFunction; })(); // 圓括號 = 立即執(zhí)行 // 包含所有代碼的圓括號使函數(shù)匿名
這個例子正式為了實現(xiàn)解決上一個陷阱“變量作用域”的最佳方案。匿名函數(shù)詳細內(nèi)容請看《Javascript的匿名函數(shù)》。YUI整個庫只有YAHOO和YAHOO_config兩個全局變量,它正是大量應(yīng)用匿名函數(shù)和命名空間的方法來實現(xiàn),具體請看《Javascript的一種模塊模式》。
出處:藍色理想
責(zé)任編輯:bluehearts
上一頁 JavaScript的陷阱 [2] 下一頁 JavaScript的陷阱 [4]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|