加速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 相关文章推荐
ajaxControlToolkit AutoCompleteExtender的用法
Oct 30 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
jquery让指定的元素闪烁显示的方法
Mar 17 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
JavaScript多并发问题如何处理
Oct 28 Javascript
jQuery解析Json实例详解
Nov 24 Javascript
jQuery实现选项卡功能(两种方法)
Mar 08 Javascript
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
vue监听用户输入和点击功能
Sep 27 Javascript
vue 全局环境切换问题
Oct 27 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
vue中v-model对select的绑定操作
Aug 31 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
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
基于node实现websocket协议
2016/04/25 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
学习python类方法与对象方法
2016/03/15 Python
python中zip()方法应用实例分析
2016/04/16 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
详解python 爬取12306验证码
2019/05/10 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
什么是URL
2015/12/13 面试题
幸福家庭事迹材料
2014/12/20 职场文书
大学学生会辞职信
2015/05/13 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技