JScript RuntimeObject检测全局污染
作者:Denis 来源:Denis'Blog 发布时间:2010-09-13 12:26:00
标签:JScript,RuntimeObject,IE
这是一篇关于使用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 特性。


猜你喜欢
- 一:js原型继承四步曲//js模拟类的创建以及继承 //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,
- 一、Beautiful Soup库简介BeautifulSoup4 是一个 HTML/XML 的解析器,主要的功能是解析和提取 HTML/X
- 背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6、7万封邮件,使用stat()和retr(whic
- Pytorch凭借动态图机制,获得了广泛的使用,大有超越tensorflow的趋势,不过在工程应用上,TF仍然占据优势。有的时候我们会遇到这
- 本文实例讲述了php 多继承的几种常见实现方法。分享给大家供大家参考,具体如下:class Parent1 { function
- 目录各种姿势比较快的姿势最后各种姿势比如说有一个简单的任务,就是从 1 累加到 1 亿,我们至少可以有 7 种方法来实现,列举如下:1、wh
- 列表和元组:list是一种有序的集合,可以随时添加和删除其中的元素.1,创建一个普通列表List = ['Jack',
- 前言在使用mongo数据库时,简单的查询基本上可以满足大多数的业务场景,但是试想一下,如果要统计某一荐在指定的数据中出现了多少次该怎么查询呢
- 1.什么是装饰器?要理解什么是装饰器,您首先需要熟悉Python处理函数的方式。从它的观点来看,函数和对象没有什么不同。它们有属性,可以重新
- 用于匹配的正则表达式为 :([1-9]\d*\.?\d*)|(0\.\d*[1-9])([1-9] :匹配1~9的数字;\d :匹配数字,包
- 对于vue.js中的this.emit的理解:this.emit(‘increment1',”这个位子是可以加参数的”);其实它的作
- 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是k
- 本文实例讲述了基于scrapy实现的简单蜘蛛采集程序。分享给大家供大家参考。具体如下:# Standard Python library i
- 几何变换图像的几何变换是指将一幅图像映射到另一幅图像内。有缩放、翻转、仿射变换、透视、重映射等操作。1 缩放使用cv2.resize()函数
- 本文主要给大家介绍了关于python实现循环购物车功能的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:示例代码# -*- co
- 1:GET访问 浏览器 认为 是等幂的就是 一个相同的URL 只有一个结果[相同是指 整个URL字符串完全匹配]所以 第二次访问的时候 如果
- 目录Pyppeteer 是什么Pyppeteer能做什么截图导出PDF公众号链接导出PDF示例Pyppeteer 是什么介绍 Pyppete
- 一、分支结构为了限定用户正规操作,也为了更好的控制程序的逻辑,必须在适当时引入条件结构。Python 条件语句是通过一条或多条语句的执行结果
- 如下所示:from urllib.parse import quoteimport stringurl = r'http://www
- python pycharm中使用opencv时,没有代码自动补全提示解决方案有2种今天工作时突然发现,在写OPENCV相关代码时,没有自动