我们知道,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 ) {
var jQuery = function ( selector, context ) {
return new jQuery.fn.init( selector, context );
},
_jQuery = window.jQuery,
_$ = window.$,
document = window.document,
}
window.jQuery = window.$ = jQuery;
})(window);
|
把window传进闭包内,就省得它每次都往外找window了。
再看其他类库
window.Raphael = ( function () {
var separator = /[, ]+/,
elements = /^(circle|rect|path|ellipse|text|image)$/,
doc = document,
win = window,
|
} 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变成一个局部变量。
运用提速技术后:
经测试,用了提速技术后,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 |
我们看一下实现原理:
如何劫持它呢?
var doc = document;
var document = doc;
|
这样明显不行因为在预编译阶段,var变量会提前,上面代码相当于
var doc
var document
doc = document
document = doc
|
没有办法,只好在执行期才定义这个document变量,javascript的动态解析技术派上用场了,eval就是其代表之一。
var doc = document;
eval( 'var document = doc' );
|
为了让IE专用,用了IE特有的条件编译。
嘛,window的东西其实蛮多,我们一一把它们变成本地变量又如何?
我们可以再扩展一下,让其更多全局变量或全局方法局部化。不过经验测,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)
}
|
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库