利用函数的惰性载入提高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 相关文章推荐
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
Jan 09 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
AngularJS 中的指令实践开发指南(一)
Mar 20 Javascript
jQuery中deferred对象使用方法详解
Jul 14 Javascript
Bootstrap如何激活导航状态
Mar 22 Javascript
把vue-router和express项目部署到服务器的方法
Feb 21 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 27 Javascript
vue登录以及权限验证相关的实现
Oct 25 Javascript
小程序实现可拖动的悬浮按钮
Sep 07 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
微信小程序使用前置摄像头拍照
Oct 22 Javascript
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
德生1994机评
2021/03/02 无线电
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
js返回顶部实例分享
2016/12/21 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
JS实现百度搜索框
2021/02/25 Javascript
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
密封类可以有虚函数吗
2014/08/11 面试题
竟聘演讲稿范文
2013/12/31 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
生活小常识广播稿
2014/09/16 职场文书
2015年统战工作总结
2015/05/19 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS