日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > web前端 > jscript > 怎樣寫出更好的JavaScript程序之undefined篇(中)

怎樣寫出更好的JavaScript程序之undefined篇(中)

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-03-05 02:09:24 閱讀次數(shù):3536次

  前一篇我介紹了幾種廣為使用的利用undefined這個(gè)概念值的辦法,這一篇我會(huì)介紹一些不太常見的辦法,其中還包括一個(gè)很巧妙的,我個(gè)人覺得很值得推廣的辦法。

  寫在前面的依然是消歧義聲明:本文中JavaScript是指一般意義上的JavaScript,并不只限定“自稱是JavaScript”的運(yùn)行環(huán)境;“全局變量”和“全局對(duì)象的屬性”是指同樣的東西,只是因?yàn)橐浜仙舷挛牟庞昧瞬煌恼f(shuō)法,正文中我就不再另外解釋了;“聲明”指通過(guò)“var”語(yǔ)句聲明變量和/或?qū)瘮?shù)及其簽名的定義;“變量”指通過(guò)“var”語(yǔ)句聲明過(guò)或者在函數(shù)體中試圖訪問(wèn)的命名參數(shù);“undefined”指名為“undefined”的值(全局或本地變量),而“未定義”指type(...) == “undefined”的概念值;“output”是向我們顯示傳入?yún)?shù)的函數(shù),其實(shí)就是“alert”的同類。

  首先介紹的是和void(0)具有異曲同工之妙的一種辦法,我們知道在JavaScript中嘗試訪問(wèn)任何一個(gè)“沒有返回值”的函數(shù)的執(zhí)行結(jié)果,都會(huì)得到“未定義”這個(gè)概念值,所以我們可以這樣做:

  myVar = function(){}();

  這個(gè)方法的原理是創(chuàng)建一個(gè)空函數(shù),并且獲取其(根本不存在的)返回值。很明顯,我們會(huì)得到“未定義”這個(gè)概念值,這個(gè)原理是和void(0)一樣的。需要特別注意的是,只有當(dāng)function關(guān)鍵字在語(yǔ)句之首的時(shí)候,才可以使用這種調(diào)用方式;如果需要直接調(diào)用一個(gè)匿名函數(shù),應(yīng)該這樣做:
(function(){
// code here
})();

第二種不常見的辦法是訪問(wèn)window.undefined,就像下邊這樣:

  假如我們不想污染全局作用域,我們就可以用這種方式來(lái)創(chuàng)造一個(gè)閉包——很多現(xiàn)有的JavaScript庫(kù)就是這樣做的。這種辦法是在不了解void(0)的執(zhí)行效果的情況下誕生的,既然我們知道void(0),也就不需要這種辦法了。
output(myVar === window.undefined);
myVar = window.undefined;

這種辦法的原理是:

如果JavaScript的運(yùn)行環(huán)境預(yù)定義了undefined這一值,window.undefined就可以直接訪問(wèn)到;

如果沒有預(yù)先定義undefined這一值,window.undefined就會(huì)返回“未定義”這一概念值——還是我們想要的東西。

訪問(wèn)形式從“全局變量”變成“屬性”以后,腳本引擎就不會(huì)認(rèn)為這是一個(gè)意外操作了,因此代碼可以正確執(zhí)行。然而這種辦法還是存在不足:

undefined在所有的JavaScript引擎中都不是保留字,也就是說(shuō)它是可以被污染的,這會(huì)影響我們的程序的運(yùn)行效果;

直接訪問(wèn)全局對(duì)象的屬性效率是很差的,應(yīng)該避免這么做。因此,接下來(lái)就要介紹我所見過(guò)的最為有趣的辦法——在本地聲明undefined變量!

它的做法是這樣的:

說(shuō)到這里我要提一下,有的人對(duì)“早期的瀏覽器上沒有undefined”這一說(shuō)法有不同的理解,認(rèn)為上面這樣的做法是行不通的。

而我認(rèn)為這種觀點(diǎn)是不對(duì)的,在我的印象中(大約是2003年),IE5雖然沒有預(yù)定義undefined,但并不影響我們的不指派聲明。

不過(guò)畢竟是很多年前的事情,記憶模糊,為了避免想當(dāng)然造成的錯(cuò)誤,我特地裝了Windows 98來(lái)實(shí)驗(yàn)一下:

這種調(diào)用產(chǎn)生了異常,但在這個(gè)例子中被捕獲了

 這種調(diào)用不會(huì)產(chǎn)生異常

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

IE的版本

由此可以得出,為這樣不指派聲明undefined變量擔(dān)憂是多余的。

前一篇解釋過(guò),在JavaScript中,如果嘗試讀取一個(gè)沒有預(yù)定義也未聲明過(guò)的變量,會(huì)引發(fā)一個(gè)“不存在(未定義)”異常,因此在早期的瀏覽器上如果直接訪問(wèn)undefined的操作可能會(huì)失敗。

這種(引發(fā)異常的)現(xiàn)象可能是為了方便排除故障而有意設(shè)計(jì)的;而對(duì)于聲明過(guò)的變量,即使是未經(jīng)賦值,也不會(huì)在讀取的時(shí)候引發(fā)異常——經(jīng)過(guò)聲明就表示開發(fā)人員確定有“這個(gè)東西”。

上面這種在函數(shù)作用域內(nèi)聲明本地變量undefined的做法,既解決了引用未聲明變量會(huì)引發(fā)異常的問(wèn)題,又避免了受全局變量污染的影響,還取代了void(0)這種乍看之下意味不明的小把戲,不僅沒有造成難以覺察的拼寫錯(cuò)誤的隱患,還能提高運(yùn)算效率——真是一舉N得的妙招!

所以了解了這么多之后就發(fā)現(xiàn),最后介紹的這種辦法實(shí)在是居家旅行、殺人滅口的首選

如果有人問(wèn):“undefined應(yīng)該怎么用?”我們現(xiàn)在就可以回答:就這么用!

終于到了結(jié)尾,有的人可能忍不住要問(wèn)了:為什么在這個(gè)系列中我的代碼示例都用三個(gè)等號(hào)的“嚴(yán)格相等”來(lái)比較??jī)蓚€(gè)等號(hào)的普通的“相等”有什么問(wèn)題嗎?

這就是這個(gè)系列的下篇要講解的內(nèi)容:undefined及其各種等價(jià)形態(tài)的適用場(chǎng)合。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲精品一二 | 国产成人免费看一级大黄 | 一区二区在线 | 日韩综合图区 | 精久久久久 | av中文在线资源 | 精品国产凹凸成av人导航 | 久久免费影院 | 日韩99 | 国产一区二区三区视频播放 | 麻豆视频国产 | 日剧天堂 | 国产精品视频免费观看 | 午夜av影院 | 国产精品3区 | 国产麻豆一区 | 黄色aaa大片| 色噜噜偷拍精品综合在线 | 亚洲高清在线观看 | 欧美日韩一区不卡 | 久久精品久久久精品美女 | 国产精品高清在线观看 | 国产精品视频一区二区免费不卡 | 在线a毛片免费视频观看 | 美女视频一区二区三区 | 在线观看国产 | 亚洲高清不卡一区 | 日本99精品 | 999久久精品 | 国产乱码一区二区三区 | 粉嫩av亚洲一区二区图片 | 麻豆国产一区二区三区四区 | 国产视频一区二区 | 国产精品日韩欧美一区二区 | 精品嫩草 | 日本在线观看视频 | 亚洲一区精品在线 | a黄色毛片 | 日韩成人精品视频 | 欧美一区二区三区在线观看 | 亚洲国产福利 |