寫出更好的JavaScript程式之undefined篇(中)_javascript技巧

來源:互聯網
上載者:User
寫在前面的依然是消歧義聲明:本文中JavaScript是指一般意義上的JavaScript,並不只限定“自稱是JavaScript”的運行環境;“全域變數”和“全域對象的屬性”是指同樣的東西,只是因為要配合上下文才用了不同的說法,本文中我就不再另外解釋了;“聲明”指通過“var”語句聲明變數和/或對函數及其簽名的定義;“變數”指通過“var”語句聲明過或者在函數體中試圖訪問的具名引數;“undefined”指名為“undefined”的值(全域或本地變數),而“未定義”指type(...) == “undefined”的概念值;“output”是向我們顯示傳入參數的函數,其實就是“alert”的同類。

首先介紹的是和void(0)具有異曲同工之妙的一種辦法,我們知道在JavaScript中嘗試訪問任何一個“沒有傳回值”的函數的執行結果,都會得到“未定義”這個概念值,所以我們可以這樣做:
myVar = function(){}();
這個方法的原理是建立一個空函數,並且擷取其(根本不存在的)傳回值。很明顯,我們會得到“未定義”這個概念值,這個原理是和void(0)一樣的。
需要特別注意的是,只有當function關鍵字不在語句之首的時候,才可以使用這種調用方式;如果需要直接調用一個匿名函數,應該這樣做:

(function(){
// code here
})();
假如我們不想汙染全域範圍,我們就可以用這種方式來創造一個閉包——很多現有的JavaScript庫就是這樣做的。
這種辦法是在不瞭解void(0)的執行效果的情況下誕生的,既然我們知道void(0),也就不需要這種辦法了。

第二種不常見的辦法是訪問window.undefined,就像下邊這樣:
output(myVar === window.undefined);
myVar = window.undefined;
這種辦法的原理是:
如果JavaScript的運行環境預定義了undefined這一值,window.undefined就可以直接存取到;
如果沒有預先定義undefined這一值,window.undefined就會返回“未定義”這一概念值——還是我們想要的東西。
訪問形式從“全域變數”變成“屬性”以後,指令碼引擎就不會認為這是一個意外操作了,因此代碼可以正確執行。


然而這種辦法還是存在不足:
undefined在所有的JavaScript引擎中都不是保留字,也就是說它是可以被汙染的,這會影響我們的程式的運行效果;
直接存取全域對象的屬性效率是很差的,應該避免這麼做。

因此,接下來就要介紹我所見過的最為有趣的辦法——在本地聲明undefined變數!
它的做法是這樣的:
function myFunc(){
var undefined;
// some code here
output(myVar === undefined);
myVar = undefined;
}
說到這裡我要提一下,有的人對“早期的瀏覽器上沒有undefined”這一說法有不同的理解,認為上面這樣的做法是行不通的。
而我認為這種觀點是不對的,在我的印象中(大約是2003年),IE5雖然沒有預定義undefined,但並不影響我們的不指派聲明。
不過畢竟是很多年前的事情,記憶模糊,為了避免想當然造成的錯誤,我特地裝了Windows 98來實驗一下:

這種調用不會產生異常

上面兩幅是用了QQ螢幕截取 ,不知道為什麼變成了JPG,下邊這幅是用OneNote截取的。

IE的版本

由此可以得出,為這樣不指派聲明undefined變數擔憂是多餘的。
前一篇解釋過,在JavaScript中,如果嘗試讀取一個沒有預定義也未聲明過的變數,會引發一個“不存在(未定義)”異常,因此在早期的瀏覽器上如果直接存取undefined的操作可能會失敗。
這種(引發異常的)現象可能是為了方便排除故障而有意設計的;而對於聲明過的變數,即使是未經賦值,也不會在讀取的時候引發異常——經過聲明就表示開發人員確定有“這個東西”。

上面這種在函數範圍內聲明本地變數undefined的做法,既解決了引用未聲明變數會引發異常的問題,又避免了受全域變數汙染的影響,還取代了void(0)這種乍看之下意味不明的小把戲,不僅沒有造成難以覺察的拼字錯誤的隱患,還能提高運算效率——真是一舉N得的妙招!
所以瞭解了這麼多之後就發現,最後介紹的這種辦法實在是居家旅行、殺人滅口的首選
如果有人問:“undefined應該怎麼用?”我們現在就可以回答:就這麼用!


終於到了結尾,有的人可能忍不住要問了:為什麼在這個系列中My Code樣本都用三個等號的“嚴格相等”來比較?兩個等號的普通的“相等”有什麼問題嗎?
這就是這個系列的下篇要講解的內容:undefined及其各種等價形態的適用場合。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.