利用函数的惰性载入提高javascript代码执行效率


Posted in Javascript onMay 05, 2014

在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的 if 语句,以检查浏览器特性,解决不同浏览器的兼容问题。 例如,我们最常见的为 dom 节点添加事件的函数:

function addEvent (type, element, fun) { 
if (element.addEventListener) { 
element.addEventListener(type, fun, false); 
} 
else if(element.attachEvent){ 
element.attachEvent('on' + type, fun); 
} 
else{ 
element['on' + type] = fun; 
} 
}

每次调用 addEvent 函数的时候,它都要对浏览器所支持的能力进行检查,首先检查是否支持addEventListener 方法,如果不支持,再检查是否支持 attachEvent 方法,如果还不支持,就用 dom 0 级的方法添加事件。 这个过程,在 addEvent 函数每次调用的时候都要走一遍,其实,如果浏览器支持其中的一种方法,那么他就会一直支持了,就没有必要再进行其他分支的检测了, 也就是说,if 语句不必每次都执行,代码可以运行的更快一些。

解决的方案就是称之为惰性载入的技巧。

所谓惰性载入,就是说函数的if分支只会执行一次,之后调用函数时,直接进入所支持的分支代码。 有两种实现惰性载入的方式,第一种事函数在第一次调用时,对函数本身进行二次处理,该函数会被覆盖为符合分支条件的函数,这样对原函数的调用就不用再经过执行的分支了, 我们可以用下面的方式使用惰性载入重写 addEvent()。

function addEvent (type, element, fun) { 
if (element.addEventListener) { 
addEvent = function (type, element, fun) { 
element.addEventListener(type, fun, false); 
} 
} 
else if(element.attachEvent){ 
addEvent = function (type, element, fun) { 
element.attachEvent('on' + type, fun); 
} 
} 
else{ 
addEvent = function (type, element, fun) { 
element['on' + type] = fun; 
} 
} 
return addEvent(type, element, fun); 
}

在这个惰性载入的 addEvent() 中,if 语句的每个分支都会为 addEvent 变量赋值,有效覆盖了原函数。 最后一步便是调用了新赋函数。下一次调用 addEvent() 的时候,便会直接调用新赋值的函数,这样就不用再执行if 语句了。

第二种实现惰性载入的方式是在声明函数时就指定适当的函数。 这样在第一次调用函数时就不会损失性能了,只在代码加载时会损失一点性能。 一下就是按照这一思路重写的 addEvent()。

var addEvent = (function () { 
if (document.addEventListener) { 
return function (type, element, fun) { 
element.addEventListener(type, fun, false); 
} 
} 
else if (document.attachEvent) { 
return function (type, element, fun) { 
element.attachEvent('on' + type, fun); 
} 
} 
else { 
return function (type, element, fun) { 
element['on' + type] = fun; 
} 
} 
})();

这个例子中使用的技巧是创建一个匿名的自执行函数,通过不同的分支以确定应该使用那个函数实现,实际的逻辑都一样, 不一样的地方就是使用了函数表达式(使用了 var 定义函数)和新增了一个匿名函数,另外每个分支都返回一个正确的函数,并立即将其赋值给变量 addEvent。

惰性载入函数的优点只执行一次 if 分支,避免了函数每次执行时候都要执行 if 分支和不必要的代码,因此提升了代码性能,至于那种方式更合适,就要看您的需求而定了。

Javascript 相关文章推荐
JavaScript 捕获窗口关闭事件
Jul 26 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
Dec 24 Javascript
jquery实现简单的自动播放幻灯片效果
Jun 13 Javascript
Bootstrap3学习笔记(二)之排版
May 20 Javascript
Vue.js -- 过滤器使用总结
Feb 18 Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 Javascript
微信小程序实现滚动加载更多的代码
Dec 06 Javascript
vue 实现超长文本截取,悬浮框提示
Jul 29 Javascript
JavaScript嵌入百度地图API的最详细方法
Apr 16 Javascript
vue组件的路由高亮问题解决方法
May 11 Vue.js
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
May 05 #Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 #Javascript
javascript 获取元素样式必杀技
May 04 #Javascript
javascript操作excel生成报表全攻略
May 04 #Javascript
javascript如何使用bind指定接收者
May 04 #Javascript
用jquery.sortElements实现table排序
May 04 #Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 #Javascript
You might like
比较详细PHP生成静态页面教程
2012/01/10 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
python 调用c语言函数的方法
2017/09/29 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
django ORM之values和annotate使用详解
2020/05/19 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
幼师专业毕业生自荐信
2013/09/29 职场文书
职工运动会邀请函
2014/02/02 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
档案保密承诺书
2014/06/03 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
学习作风建设心得体会
2014/10/22 职场文书
安全保证书怎么写
2015/02/28 职场文书
入伍通知书
2015/04/23 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
如何做好工作总结!
2019/04/10 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python