這是一篇關(guān)于使用JScript RuntimeObject(MSDN)調(diào)試的文章。雖然這些例子中的大多數(shù)在其他瀏覽器中不能運行,但在IE 5.5+中都能運行。
泄露的全局標識符
比如說你一不小心創(chuàng)建了一個全局屬性,如:
function playRugby(players) { var items, i; len = items.length; // Global. } function kick() { var x = 10 y = 11; // As I makes y global. }
當調(diào)用playRugby時,創(chuàng)建了全局屬性len,如果它尚未存在,那么就將items.length的值賦給它。同樣,當調(diào)用kick時,創(chuàng)建了全局屬性y。
這些全局變量都不是故意的。它們破壞了封裝并泄露了執(zhí)行的細節(jié)。這可能會導(dǎo)致沖突和棘手的依賴問題。
要檢測這些不經(jīng)意間創(chuàng)建的全局標識符,我們可以使用for in循環(huán)全局對象。Firebug的”DOM”標簽提供了這個實用的全局檢測。
遺憾的是,在IE中,for in不能枚舉任何全局變量和函數(shù)聲明?纯聪旅娴睦樱
// Property of global variable object. var EX1_GLOBAL_VARIABLE = 10; // Property of global object. this.EX1_GLOBAL_PROPERTY = 11; // Property of global variable object. function EX1_GLOBAL_FUNCTION(){} (function(){ var results = []; for(var p in this) { results.push(p); } alert("Leaked:\n" + results.join("\n")); })();
在IE中,結(jié)果包含一個window屬性組合和用戶定義的四個屬性之一:EX1_GLOBAL_PROPERTY 。
那么,其它三個用戶定義的屬性發(fā)生了什么?為什么它們不能在for in循環(huán)中顯示出來。
事實證明,枚舉全局對象時將枚舉已賦值的全局對象屬性,而不枚舉全局變量。
為什么全局屬性能枚舉而全局變量不能。經(jīng)驗告訴我們,JScript 給全局變量(用var聲明)打上了DontEnum標記。由于全局對象是作為全局變量對象來定義的,這看起來似乎是一個合理的解釋。這并不標準,但能解釋IE中的行為。不過,Eric Lippert 提出了另一種解釋:全局對象和全局變量對象是IE中兩個不同的對象。
根據(jù)MS-ES3:
JScript 5.x 中的變量聲明創(chuàng)建了全局對象的屬性,該屬性擁有DontEnum 特性。
出處:
責(zé)任編輯:bluehearts
上一頁 下一頁 用JScript RuntimeObject檢測全局污染 [2]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|