遺漏的參數(shù)
當(dāng)給函數(shù)增加一個參數(shù)時,一個常見的錯誤是忘記更新這個函數(shù)的所有調(diào)用。如果你需要在已經(jīng)被調(diào)用的函數(shù)中增加一個參數(shù)來處理一個特殊情況下的調(diào)用,請給這個函數(shù)中的這個參數(shù)設(shè)置默認(rèn)值,以防萬一在眾多腳本中的眾多調(diào)用中的一個忘記更新。
function addressFunction(address, city, state, country){ country = country || “US”; //如果沒有傳入country,假設(shè) “US” span>//剩下代碼 }
你也能通過獲取arguments來解決。但是在這篇文章我們的注意力在陷阱上。同時在《Javascript風(fēng)格要素(2)》也介紹了||巧妙應(yīng)用。
for語句
在JavaScript中“for”循環(huán)將遍歷所有的對象屬性(attribute),包括方法和屬性(property)。決不能使用for in來遍歷數(shù)組:僅在當(dāng)需要遍歷對象屬性和方法時才使用for in。
- for(var myVar in myObject)用一個指定變量無任何規(guī)律地遍歷對象的所有屬性。如果for/in循環(huán)的主體刪除了一個還沒有枚舉出的屬性,那么該屬性就不在枚舉。如果循環(huán)主體定義了新屬性,那么循環(huán)是否枚舉該屬性則是由JavaScript的實現(xiàn)決定。
- for(var 1=0; i < myArray.length; i++)會遍歷完一個數(shù)組的所有元素。
為了解決這個問題,大體上你可以對對象使用 for … in,對數(shù)組使用for循環(huán):
listItems = document.getElementsByTagName('li'); for (var listitem in listItems){ //這里將遍歷這個對象的所有屬性和方法,包括原生的方法和屬性,但不遍歷這個數(shù)組:出錯了! } //因為你要循環(huán)的是數(shù)組對象,所用for循環(huán) for ( var i = 0; i < listItems.length; i++) { //這是真正你想要的 }
對象的有些屬性以相同的方式標(biāo)記成只讀的、永久的或不可列舉的,這些屬性for/in無法枚舉。實際上,for/in循環(huán)會遍歷所有對象的所有可能屬性,包括函數(shù)和原型中的屬性。所有修改原型屬性可能對for/in循環(huán)帶來致命的危害,所以需要采用hasOwnProperty和typeof做一些必要的過濾,最好是用for來代替for/in。
switch語句
Estelle Weyl寫了一篇 switch statement quirks ,其要點是:
- 沒有數(shù)據(jù)類型轉(zhuǎn)換
- 一個匹配,所有的表達式都將執(zhí)行直到后面的break或return語句執(zhí)行
- 你可以對一個單獨語句塊使用多個case從句
undefined ≠ null
null是一個對象,undefined是一個屬性、方法或變量。存在null是因為對象被定義。如果對象沒有被定義,而測試它是否是null,但因為沒有被定義,它無法測試到,而且會拋出錯誤。
if(myObject !== null && typeof(myObject) !== 'undefined') { //如果myObject是undefined,它不能測試是否為null,而且還會拋出錯誤 } if(typeof(myObject) !== 'undefined' && myObject !== null) { //處理myObject的代碼 }
Harish Mallipeddi 對undefined和null有一個說明。
事件處理陷阱
剛接觸事件處理時最常見的寫法就是類似:
window.onclick = MyOnClickMethod
這種做法不僅非常容易出現(xiàn)后面的window.onclick事件覆蓋掉前面的事件,還可能導(dǎo)致大名頂頂?shù)腎E內(nèi)存泄露問題。為了解決類似問題,4年前 Simon Willison 就寫出了很流行的addLoadEvent():
function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; }else { window.onload = function() { oldonload(); unc(); } } } addEvent(window,'load',func1,false); addEvent(window,'load',func2,false); addEvent(window,'load',func3,false);
當(dāng)然在JavaScript庫盛行的現(xiàn)在,使用封裝好的事件處理機制是一個很好的選擇,比如在YUI中就可以這樣寫:
YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);
本文鏈接:http://www.95time.cn/tech/web/2008/6254.asp
出處:藍色理想
責(zé)任編輯:bluehearts
上一頁 JavaScript的陷阱 [4] 下一頁
◎進入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|