Firebug 困惑
那么,在Firebug中會(huì)發(fā)生什么呢?為什么在控制臺(tái)中定義的變量可以被刪除,難道與我們剛才了解到相反?很好,我先前說過,當(dāng)涉及到的變量聲明,Eval 代碼(Eval code)有一個(gè)特殊的行為。在Eval 代碼(Eval code)中聲明的變量實(shí)際上沒有創(chuàng)建DontDelete 特性。
eval( 'var foo = 1;' );
foo; // 1
delete foo; // true
typeof foo; // "undefined"confusion
同樣,在函數(shù)代碼(Function code)調(diào)用也是如此:
( function (){
eval( 'var foo = 1;' );
foo; // 1
delete foo; // true
typeof foo; // "undefined"
})();
這是Firebug的異常行為的要點(diǎn),在控制臺(tái)的所有文本似乎是作為Eval 代碼(Eval code)來解析和執(zhí)行的,而不是作為一個(gè)全局對(duì)象或函數(shù)對(duì)象,顯然,任何聲明的變量沒有DontDelete特性,因此可以很容易地刪除,應(yīng)該意識(shí)到正常全局代碼和Firebug控制臺(tái)之間的分歧。
通過eval刪除變量
這個(gè)有趣的eval 屬性,連同ECMAScript 其它方面的技巧可以讓我們刪除不可刪除的屬性。在同一個(gè)執(zhí)行上下文中,函數(shù)聲明能覆蓋同一名字的變量。
function x(){ }
var x;
typeof x; // "function"
注意函數(shù)如何獲得優(yōu)先權(quán)并覆蓋同名變量(或者換句話說,可變對(duì)象相同的屬性)。這是因?yàn)?strong>函數(shù)聲明在變量聲明之后實(shí)例化,并且可以覆蓋它們。函數(shù)聲明不僅取代了先前的屬性值,而且也取代了屬性特性。如果我們通過eval 聲明函數(shù),該函數(shù)也應(yīng)該替換自身的屬性特性。既然在eval 內(nèi)聲明的變量沒有DontDelete特性,那么實(shí)例化這個(gè)新函數(shù)應(yīng)該從本質(zhì)上消除屬性中現(xiàn)有的DontDelete特性,是的這個(gè)屬性可以刪除(當(dāng)然也就改變引用新創(chuàng)建函數(shù)的值)。
var x = 1;
/* Can't delete, `x` has DontDelete */
delete x; // false
typeof x; // "number"
eval( 'function x(){}' );
/* `x` property now references function, and should have no DontDelete */
typeof x; // "function"
delete x; // should be `true`
typeof x; // should be "undefined"
遺憾的是,這類欺騙在我嘗試中并不總是運(yùn)行,我可能丟失了一些東西,或者這種行為過于簡單不足以引起注意。
出處:
責(zé)任編輯:bluehearts
上一頁 理解delete [3] 下一頁 理解delete [5]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|