IE bugs
整個(gè)章節(jié)僅僅為了IE中的bug,想不到吧!
在IE瀏覽器中(至少是IE6-IE8),下面的表達(dá)式拋出錯(cuò)誤(在全局代碼中執(zhí)行):
this .x = 1;
delete x; // TypeError: Object doesn't support this action
這個(gè)也是一樣,但異常不同,只是更有趣:
var x = 1;
delete this .x; // TypeError: Cannot delete 'this.x'
IE中看起來好像在全局代碼中聲明變量不能在全局對(duì)象中創(chuàng)建屬性。通過賦值創(chuàng)建屬性(this.x = 1 ),然后通過delete 刪除x將拋出錯(cuò)誤。通過聲明創(chuàng)建創(chuàng)建屬性(var x = 1 ),然后通過delete this.x 刪除將拋出另外一個(gè)錯(cuò)誤。
但這還沒完。實(shí)際上通過明確的賦值創(chuàng)建的屬性在刪除時(shí)始終引發(fā)錯(cuò)誤。這不僅是一個(gè)錯(cuò)誤,而且創(chuàng)建的屬性似乎設(shè)置了DontDelete特性,這當(dāng)然不應(yīng)該有:
this .x = 1;
delete this .x; // TypeError: Object doesn't support this action
typeof x; // "number" (still exists, wasn't deleted as it should have been!)
delete x; // TypeError: Object doesn't support this action
typeof x; // "number" (wasn't deleted again)
與我們思考的相反,未聲明的變量(應(yīng)該在一個(gè)全局對(duì)象中創(chuàng)建屬性)在IE中創(chuàng)建了可刪除屬性。
x = 1;
delete x; // true
typeof x; // "undefined"
但是,如果您嘗試通過“this”引用在全局代碼中刪除它(delete this.x ),一個(gè)熟悉的錯(cuò)誤彈出:
x = 1;
delete this .x; // TypeError: Cannot delete 'this.x'
如果我們總結(jié)這些行為,從全局代碼中delete this.x 似乎是不成功的。當(dāng)涉及到的屬性是通過顯式聲明(this.x = 1 )來創(chuàng)建的,delete 將拋出一個(gè)錯(cuò)誤。當(dāng)屬性是通過未聲明的賦值(x = 1 )或聲明(var x = 1 )來創(chuàng)建屬性時(shí),delete 將拋出另一個(gè)錯(cuò)誤。
另一方面,當(dāng)涉及到的屬性是通過顯式聲明(this.x = 1 )創(chuàng)建時(shí),delete x 拋出錯(cuò)誤。如果一個(gè)屬性是通過聲明(var x = 1 )來創(chuàng)建的,刪除根本不會(huì)發(fā)生,并返回正確的false。如果屬性是通過未聲明的方式(x = 1 )創(chuàng)建,刪除操作將按預(yù)期進(jìn)行。
去年九月我正在思考這個(gè)問題,Garrett Smith 建議“在IE中全局可變對(duì)象作為一個(gè)JScript對(duì)象,全局對(duì)象有宿主執(zhí)行”。Garrett 引用Eric Lippert’s blog entry ,我們可以通過一些測(cè)試驗(yàn)證這些理論。請(qǐng)注意,this 和window 似乎引用同一對(duì)象(如果我們相信“=== ”運(yùn)算符),但可變對(duì)象(在一個(gè)聲明的函數(shù)中的對(duì)象)不同于這一點(diǎn)。
/* in Global code */
function getBase(){ return this ; }
getBase() === this .getBase(); // false
this .getBase() === this .getBase(); // true
window.getBase() === this .getBase(); // true 7. window.getBase() === getBase(); // false
出處:
責(zé)任編輯:bluehearts
上一頁(yè) 理解delete [5] 下一頁(yè) 理解delete [7]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|