在javascript中,我們有時(shí)候要使用delete刪除對(duì)象。但是,對(duì)于delete的一些細(xì)節(jié)我們未必盡知。昨天,看到kangax分析delete的文章,獲益匪淺。本文將文章的精華部分翻譯出來(lái),與各位分享。
- 原理
- 代碼類型
- 執(zhí)行上下文
- 激活對(duì)象/可變對(duì)象
- 屬性特性
- 內(nèi)置對(duì)象和DontDelete
- 未聲明的賦值
- Firebug 困惑
- 通過(guò)eval刪除變量
- 瀏覽器兼容性
- Gecko DontDelete bug
- IE bugs
- 誤區(qū)
- ‘delete’和宿主對(duì)象
- ES5嚴(yán)格模式
- 總結(jié)
原理
為什么我們能刪除一個(gè)對(duì)象的屬性?
var o = { x: 1 };
delete o.x; // true
o.x; // undefined
但是,像這樣聲明的變量則不行:
var x = 1;
delete x; // false
x; // 1
或者如此聲明的函數(shù):
function x(){}
delete x; // false
typeof x; // "function"
注意,當(dāng)一個(gè)屬性不能被刪除時(shí),delete 只返回false。
要理解這一點(diǎn),我們首先需要掌握像變量實(shí)例化和屬性特性這樣的概念--遺憾的是這些在關(guān)于javascript的書中很少講到。我將在接下來(lái)的幾個(gè)段落中試著簡(jiǎn)明的重溫這些概念。 理解它們一點(diǎn)也不難,如果你不在乎它們?yōu)槭裁催@么運(yùn)行,你可以隨意的跳過(guò)這一章。
代碼類型
在ECMAScript中有三種類型的可執(zhí)行代碼:全局代碼(Global code)、函數(shù)代碼(Function code)和Eval code。這些類型有那么點(diǎn)自我描述,但這里還是作一個(gè)簡(jiǎn)短的概述:
- 當(dāng)一段源代碼正文被視為程序時(shí),它在全局作用域中執(zhí)行,被當(dāng)成全局代碼(Global code)。在一個(gè)瀏覽器環(huán)境中,SCRIPT元素中的內(nèi)容通常被當(dāng)作程序來(lái)解析,因此,它被當(dāng)作全局代碼來(lái)評(píng)估。
- 在一個(gè)函數(shù)內(nèi)部直接執(zhí)行的任何代碼,很明顯被當(dāng)作函數(shù)代碼(Function code)。在瀏覽器紅中事件屬性的內(nèi)容(如:
<p onclick="..."> )通常被當(dāng)作函數(shù)代碼(Function code)來(lái)解析;
- 最后,提供給內(nèi)置函數(shù)eval()的文本被當(dāng)作Eval 代碼(Eval code)來(lái)解析。我們很快會(huì)看到這種類型很特殊。
出處:
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) 理解delete [2]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|