JScript RuntimeObject检测全局污染

作者:Denis 来源:Denis'Blog 时间:2010-09-13 12:26:00 

这是一篇关于使用JScript RuntimeObject(MSDN)调试的文章。虽然这些例子中的大多数在其他浏览器中不能运行,但在IE 5.5+中都能运行。

泄露的全局标识符

比如说你一不小心创建了一个全局属性,如:

function playRugby(players) {  
var items,     
i;      
len = items.length;
// Global.
}
function kick() { 
var x = 10     
y = 11;
// As I makes y global.
}

当调用playRugby时,创建了全局属性len,如果它尚未存在,那么就将items.length的值赋给它。同样,当调用kick时,创建了全局属性y。

这些全局变量都不是故意的。它们破坏了封装并泄露了执行的细节。这可能会导致冲突和棘手的依赖问题。

要检测这些不经意间创建的全局标识符,我们可以使用for in循环全局对象。Firebug的”DOM”标签提供了这个实用的全局检测。

遗憾的是,在IE中,for in不能枚举任何全局变量和函数声明。看看下面的例子:

// 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中,结果包含一个window属性组合和用户定义的四个属性之一:EX1_GLOBAL_PROPERTY 。

那么,其它三个用户定义的属性发生了什么?为什么它们不能在for in循环中显示出来。

事实证明,枚举全局对象时将枚举已赋值的全局对象属性,而不枚举全局变量。

为什么全局属性能枚举而全局变量不能。经验告诉我们,JScript 给全局变量(用var声明)打上了DontEnum标记。由于全局对象是作为全局变量对象来定义的,这看起来似乎是一个合理的解释。这并不标准,但能解释IE中的行为。不过,Eric Lippert 提出了另一种解释:全局对象和全局变量对象是IE中两个不同的对象。

根据MS-ES3:

JScript 5.x 中的变量声明创建了全局对象的属性,该属性拥有DontEnum 特性。

标签:JScript,RuntimeObject,IE
0
投稿

猜你喜欢

  • 个人网站与动网整合非官方方法

    2009-07-05 18:42:00
  • 一个不错的javascript加密解密算法源码

    2010-03-28 13:12:00
  • 如何保持Oracle数据库的优良性能

    2009-02-26 10:39:00
  • SQL Select语句完整的执行顺序

    2008-09-28 21:22:00
  • 记录下两个正则表达式的使用

    2009-11-30 12:56:00
  • 建立合理的索引提高SQL Server的性能

    2009-01-23 14:44:00
  • 如何判断发言是否为空?

    2010-01-12 20:15:00
  • Linux下Resin+JSP+MySQL安装和配置

    2009-09-01 10:38:00
  • DOM_window对象属性之--clipboardData对象操作代码

    2011-02-05 10:49:00
  • 简单的文本内容处理工具

    2010-01-28 12:31:00
  • ASP 内建六大对象简介

    2009-06-04 18:08:00
  • SQLServer 游标简介与使用说明

    2009-07-02 13:53:00
  • 给页面加上Loading效果最简单实用的办法

    2008-11-20 11:58:00
  • ASP函数过滤数组重复数据代码

    2010-01-02 20:36:00
  • 利用ASP远程注册DLL的方法

    2008-03-05 13:00:00
  • ajax标签导航实例详解教程

    2008-02-01 10:54:00
  • Active Server Pages 错误 “ASP 0141”

    2009-08-19 17:10:00
  • MySQL的root密码丢失解决方法

    2011-05-05 15:56:00
  • 用Dreamweaver设计Wordpress留言板教程(一)

    2010-03-17 15:44:00
  • 将ASP记录集输出成n列的表格形式显示的方法

    2011-04-08 10:51:00
  • asp之家 网络编程 m.aspxhome.com