怎样为IE浏览器的javascript提速

随着现在网页设计越来越多的应用javascript技术,而且浏览器的Javascript引擎运行速度也成为各大浏览器比拼性能的重要指标,各家浏览器厂商皆宣称他们的浏览器速度更快,希望搅动现存的竞争态势。IE8浏览器的Javascript运行速度虽然相对于IE7以及IE6有着很大的提升,但相对于Webkit引擎的浏览器还是有一定的差距,在去年的ZDNET Javascript测试上Chrome浏览器表现突出,一举击败Firefox、Safari和微软的IE浏览器。不过因为IE浏览器相对庞大的使用人群,我们有必要为IE浏览器的javascript来提提速。

我们知道,浏览器在执行期时是由内到外执行脚本的,那么离我们的脚本最远的全局对象,很可能要跨越几层作用域才能访问到它。不过在IE浏览器中,从最内层到最外层要花的时间比其他多出很多。加之,javascript是一种胶水语言,它必须要调用DOM对能完成我们大多数选择。最著名的就是选择元素(document.getElementById,document.getElementsByTagName,docuemnt.evaluate,document.querySelector),创建元素(document.createElement),此外还有document.body,document.defaultView.getComputedStyle等等,频繁地调用document对象,但是document是位于window对象下,因此这路程就更远了。就了提速,我们必须把它们保存在一个本地变量,那么每次就省得它长途跋涉了。这种技术的运用明显体现在jQuery的源码中:

(function( window, undefined ) {// Define a local copy of jQueryvar jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // Use the correct document accordingly with window argument (sandbox) document = window.document, //====================省================= }// Expose jQuery to the global objectwindow.jQuery = window.$ = jQuery;})(window);

把window传进闭包内,就省得它每次都往外找window了。

再看其他类库

//Raphaelwindow.Raphael = (function () { var separator = /[, ]+/, elements = /^(circle|rect|path|ellipse|text|image)$/, doc = document, win = window,//************略**************

//dojod.global = this;

//ExtDOC = document,

//YUI//************略************ } else if (i == 'win') { c[i] = o[i].contentWindow || o[i]; c.doc = c[i].document;//************略************Y.config = { win: window || {}, doc: document,

但是如果你没有引入类库,如果让IE的javascript跑得更快些呢?用一个变量把它储存起来?在一个国外的博客看到一种很厉害的劫持技术,偷龙转凤把全局变量document变成一个局部变量。

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

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>javascript提速技术 by 司徒正美</title>

<script type="text/javascript">

var date = new Date;
for (var i = 0; i < 100000; i++) document;

alert(new Date - date);

</script>

</head>
<body>
</body>
</html>

运用提速技术后:

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>javascript提速技术 by 司徒正美</title>

<script type="text/javascript">
/*@cc_on _d=document;eval('var document=_d')@*/

var date = new Date;
for (var i = 0; i < 100000; i++) document;

alert(new Date - date);

</script>

</head>
<body>
!!!!!!!!
</body>
</html>

经测试,用了提速技术后,IE的性能比较

IE6
document document.getElementById document.title
没有使用提速技术 485 1110 1219
使用提速技术后 109 609 656
IE8
document document.getElementById document.title
没有使用提速技术 468 797 843
使用提速技术后 78 328 407

我们看一下实现原理:

document;doc; //很明显,调用这个比直接document快,document还要钻进window内部找一番

如何劫持它呢?

var doc = document;var document = doc;

这样明显不行因为在预编译阶段,var变量会提前,上面代码相当于

var docvar document //这里被劫持了doc = document //注意,document已经变成undefineddocument = doc //相当于window.undefined = undefined

没有办法,只好在执行期才定义这个document变量,javascript的动态解析技术派上用场了,eval就是其代表之一。

var doc = document;eval('var document = doc');

为了让IE专用,用了IE特有的条件编译。

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

嘛,window的东西其实蛮多,我们一一把它们变成本地变量又如何?

/*@cc_oneval((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 event body location title self top parent alert setInterval clearInterval setTimeout clearTimeout'.split(' ')));@*/

我们可以再扩展一下,让其更多全局变量或全局方法局部化。不过经验测,FF使用它会报错,chrome则慢了,其他浏览器不明显。

if( !+"v1" ){ var code = [],ri = 0,prop,str = "var " for(var a in window) code[ri++] = a; for (var i = 0 ,n = code.length;i<n;i++){ var prop = code[i] window['_'+prop] = window[prop]; str += prop+'=_'+prop+"," } str = str.slice(0,-1); eval(str) }

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>javascript提速技术 by 司徒正美</title>

<script type="text/javascript">
var __chrome = navigator.userAgent.indexOf("Chrome") !== -1;
var __firefox = !!window.Components

if( !__chrome & !__firefox ){

var code = [],ri = 0,prop,str = "var "
for(var a in window)
code[ri++] = a;
for (var i = 0 ,n = code.length;i<n;i++){
var prop = code[i]
window['_'+prop] = window[prop];
str += prop+'=_'+prop+","
}
str = str.slice(0,-1);
eval(str)
}
var date = new Date;
for (var i = 0; i < 100000; i++)
document;

alert(new Date - date);

</script>

</head>
<body>
!!!!!!
</body>
</html>

文章来源:http://www.cnblogs.com/rubylouvre/archive/2010/02/11/1667628.html

虽然IE8的发布并没有给我们带来多大的惊喜,但根据微软所公布了IE9的各种评测效能信息,惊奇的发现,IE9在而针对Javascript引擎性能的SunSpider测试中,IE9大幅超越了IE7与IE8,并与Chrome、Safari及Firefox浏览器的Javascript运行基本处于同一等级。希望微软以后不要在重蹈IE8的覆辙,毕竟微软现在出新浏览器的动作是越来越勤奋了,记得当前IE6了,不知用了多少年,才听说有了IE7了,到现在IE8才超越IE6成为全球最流行的浏览器版本,我们期盼微软IE9浏览器能够让竞争对手刮目相看。

(0)

相关推荐

  • 为IE浏览器的javascript提速

    随着现在网页设计越来越多的应用javascript技术,而且浏览器的Javascript引擎运行速度也成为各大浏览器比拼性能的重要指标,各家浏览器厂商皆宣称他们的浏览器速度更快,希望搅动现存的竞争态势 ...

  • 如何关闭Win10 Edge浏览器的JavaScript设置项

    今天给大家介绍一下如何关闭Win10 Edge浏览器的JavaScript设置项的具体操作步骤.1. 首先打开电脑,进入桌面,点击左下角的开始图标,在程序中,找到edge浏览器图标,打开2. 进入浏览 ...

  • Mac电脑如何在Edge浏览器添加JavaScript阻止站点

    Edge是一款多平台的浏览器软件,有些用户想知道Mac电脑如何在Edge浏览器添加JavaScript阻止站点,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步打开电脑中的Edge ...

  • Mac电脑如何在Edge浏览器删除JavaScript允许站点

    Edge是一款多平台的浏览器软件,有些用户想知道Mac电脑如何在Edge浏览器删除JavaScript允许站点,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步打开电脑中的Edge ...

  • Chrome浏览器的JavaScript控制台

    Chrome是Google公司开发的一款浏览器,功能比较强大,各种插件和扩展比较丰富,下面我们来看一下如何使用Chrome浏览器的Javascript控制台. 操作方法 01 启动Chrome浏览器, ...

  • 网页技术:开启浏览器对JavaScript的支持

    操作方法 01 工具 → Internet选项. 02 点击"高级"选项卡. 03 (辅助寻找需要设置的选项)找到"安全"选项组这个名称,继续往下拖动滚动条. ...

  • firefox怎么禁用javascript和flash?火狐浏览器屏蔽js的方法

    浏览器是大家上网冲浪的常用工具,想必有很多人对firefox情有独钟吧.网站为了提高其功能,操作,视觉的体验指数,就会使用到javascript和flash,这样可以给用户带来美的享受和体验:但是,当 ...

  • 千影浏览器怎么设置允许网站运行Javascript?

    有时我们打开网页时会提示我们开启浏览器的Javascript功能,那么我们应该怎么开启Javascript呢?下面就用千影浏览器的开启方法带大家了解一下! 1.先在桌面上找到千影浏览器图标,点击打开 ...

  • 手机 Chrome 浏览器禁用指定网站的 javascript

    手机版 Chrome 浏览器(即谷歌浏览器)的操作远不如电脑上桌面版的更让人觉得熟悉.比如在桌面版中非常容易的禁用网站 javascript 功能,在手机版上要多费一些周折才能实现. 在本中,先关闭安 ...