枚舉方案:JScript RuntimeObject
使用JScript RuntimeObject方法枚舉全局屬性與枚舉全局對(duì)象不同,你將使用一個(gè)正常的執(zhí)行,枚舉由全局RuntimeObject方法返回的一個(gè)對(duì)象。
var GLOBAL_VAR1, GLOBAL_VAR2, GLOBAL_VAR3 = 1; GLOBAL_PROP1 = 12; function GLOBAL_FUNCTION(){} if(this.RuntimeObject){ void function() { var ro = RuntimeObject(), results = [], prop; for(prop in ro) { results.push(prop); } alert("leaked:\n" + results.join("\n")); }(); }
IE中的結(jié)果
在IE8和其它較低版本中,結(jié)果包括GLOBAL_FUNCTION,GLOBAL_VAR3, GLOBAL_PROP1 (除此之外,還包括window)。 注意GLOBAL_VAR1 和GLOBAL_VAR2 并不包含其中。看來RuntimeObject并不收集未被賦值的任何變量,根據(jù)微軟的文檔,這不是指定的行為(以下有更多這方面的信息)。
微軟的RuntimeObject文檔
RuntimeObject是JScript 內(nèi)置的擴(kuò)展,JScript定義了七個(gè)附加的內(nèi)置全局方法: ScriptEngine,ScriptEngineBuildVersion, ScriptEngineMajorVersion, ScriptEngineMinorVersion,CollectGarbage,RuntimeObject和GetObject。 這些對(duì)象都是本地JScript對(duì)象,不要與宿主對(duì)象混淆。
對(duì)于RuntimeObject,微軟的JScript擴(kuò)展MS-ES3EX聲明如下:
RuntimeObject用來尋找一個(gè)全局變量的屬性,這些帶有名稱的屬性匹配特定的模式。這個(gè)函數(shù)只尋找全局對(duì)象中通過VariableStatement 或 FunctionDeclaration方式顯式創(chuàng)建的屬性,或是位于運(yùn)算符左側(cè)作為標(biāo)識(shí)符隱式創(chuàng)建的屬性。不能尋找通過訪問全局對(duì)象顯式創(chuàng)建的屬性。
粗略的測(cè)試結(jié)果表明微軟的文檔是不靠譜的。
返回的對(duì)象不包括添加到變量對(duì)象之上的所有標(biāo)識(shí)符,只是那些被賦值的標(biāo)識(shí)符。無(wú)論它們是通過VariableDeclaration,F(xiàn)unctionDeclaration來創(chuàng)建,還是作為全局屬性聲明來創(chuàng)建都無(wú)關(guān)緊要。
查找通過FunctionBindingList創(chuàng)建的標(biāo)識(shí)符示例
在JScriptFunction的FunctionBindingList中,所有標(biāo)識(shí)符將成為包含的變量對(duì)象的屬性,如:
var foo = {} (function(){ function foo.bar, baz(){} })(); ro = RuntimeObject(); alert([ro.foo.bar, "undef" in ro].join("\n"));
出處:
責(zé)任編輯:bluehearts
上一頁(yè) 用JScript RuntimeObject檢測(cè)全局污染 [1] 下一頁(yè) 用JScript RuntimeObject檢測(cè)全局污染 [3]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|