加速IE的Javascript document输出的方法


Posted in Javascript onDecember 02, 2010

将下列代码加在JavaScript的最前面

/*@cc_on _d=document;eval('var document=_d')@*/

加入这样的一行代码IE的document的访问速度至少可以提高5倍以上
下面是加入前和加入后的测试比较代码
// Before 
var date = new Date; 
for (var i = 0; i < 100000; i++) document; 
alert(new Date - date); // 643

/*@cc_on _d=document;eval('var document=_d')@*/ // After 
date = new Date; 
for (var i = 0; i < 100000; i++) document; 
alert(new Date - date); // 145

速度提高了不少吧!

解说:
首先,IE里document就这样直接被调用的话被执行的是window 对象的内部函数,而这个比较低效的。根据这一点,下面的处理可以提高速度:
var doc = document;

document; // 慢
doc; // 这个比上面的(document)快

虽然像上面那么写可以直接使用,但是之前用到document的地方都要去替换,这个有点麻烦了点吧。所以,看下面的:
var doc = document;
var document = doc;
可以实现的话那就太好了……

了解JavaScript的人应该知道,JavaScript的变量是在最开始的时候就生成的,所以这里的document就变成了undefined了。
没关系,继续改进~
var doc = document;
eval('var document = doc');

eval的作用就是在作用域范围内改变变量,这样的话,后面的document就可以被正常使用了。
最后,加上只有在IE内有效的条件,就像下面这样就可以了~

/*@cc_on 
var doc = document; 
eval('var document = doc'); 
@*/

举一反三,像下面这样的写法,document以外的全局变量也可以用上面的方法,起到加速的作用。
/*@cc_on 
eval((function(props) { 
var code = []; 
for (var i = 0 l = props.length;i<l;i++){ 
var prop = props[i]; 
window['_'+prop]=window[prop]; 
code.push(prop+'=_'+prop) 
} 
return ‘var ‘+code.join(','); 
})('document self top parent alert setInterval clearInterval 
setTimeout clearTimeout'.split(' ‘))); 
@*/

下面是Franky的回复:
首先,IE里document就这样直接被调用的话被执行的是window 对象的内部函数,而这个比较低效的。根据这一点,下面的处理可以提高速度:

这个说法 不对..

之所以 你的测试 前后有差异,主要区别在于作用域链查找.
你的代码 是在global 执行环境.所以IE下,会访在global对象去查找 key 为'document'的成员. 而这个对象在ie中是一个com+实现的宿主对象. 他不在global中. global中没有,则去window中再次查找.造成了速度变慢.

同样的全局对象 Math. 就不会带来这个问题.原因是Math 在 Global上. 一次作用域链查找就找到了.

对于优化. 一个建议就是
var win = window, doc = document,undefined;
每层作用域内,如果这个成员使用超过两次,就有意义.

而如果你只在全局作用域 使用一次 ie 条件注释 ,首先 非ie就无法享受到作用域被缩短的好处. 当然非ie 不会存在global->window的 多一次责任链查找.

这里的优化核心,就是缩短作用域链. 虽然opera chrome safarai等较新版本,对作用域链查找做了优化. 但是我们认为的缩短作用域链. 对老的浏览器是有积极作用的.且对具备优化的浏览器,也不会带来过于负的面影响.

Javascript 相关文章推荐
JavaScript中的几个关键概念的理解-原型链的构建
May 12 Javascript
js日期时间补零的小例子
Mar 05 Javascript
jquery1.10给新增元素绑定事件的方法
Mar 06 Javascript
Jquery 实现图片轮换
Jan 28 Javascript
javascript弹性运动效果简单实现方法
Jan 08 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
Aug 11 Javascript
原生JS实现的放大镜效果实例代码
Oct 15 Javascript
jQuery设计思想
Mar 07 Javascript
微信小程序中post方法与get方法的封装
Sep 26 Javascript
js使用xml数据载体实现城市省份二级联动效果
Nov 08 Javascript
canvas轨迹回放功能实现
Dec 20 Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 #Javascript
javascript学习之闭包分析
Dec 02 #Javascript
JavaScript OOP面向对象介绍
Dec 02 #Javascript
JavaScript 字符串处理函数使用小结
Dec 02 #Javascript
改写一个简单的菜单 弹性大小
Dec 02 #Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
Dec 02 #Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
Dec 02 #Javascript
You might like
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
基于文本的访客签到簿
2006/10/09 PHP
mysql总结之explain
2012/02/27 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
微信小程序实现音乐播放器
2019/11/20 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
Python随机生成数模块random使用实例
2015/04/13 Python
python中的错误处理
2016/04/10 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
质检员的岗位职责
2013/11/15 职场文书
总经理驾驶员岗位职责
2013/12/04 职场文书
精彩的广告词
2014/03/19 职场文书
2015年行政部工作总结
2015/04/28 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
敬老院活动感想
2015/08/07 职场文书
学校远程教育工作总结
2015/08/11 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python