利用函数的惰性载入提高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 相关文章推荐
中文路径导致unitpngfix.js不正常的解决方法
Jun 26 Javascript
js中自定义方法实现停留几秒sleep
Jul 11 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
Angular实现响应式表单
Aug 04 Javascript
详解vue移动端项目的适配(以mint-ui为例)
Aug 17 Javascript
支付宝小程序tabbar底部导航
Nov 06 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
layUI实现列表查询功能
Jul 27 Javascript
vue 使用鼠标滚动加载数据的例子
Oct 31 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
谈谈PHP语法(4)
2006/10/09 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
JavaScript运算符小结
2015/06/03 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Python求解正态分布置信区间教程
2019/11/20 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Django values()和value_list()的使用
2020/03/31 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
导游的职业规划书范文
2013/12/27 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
初一学生评语大全
2014/04/24 职场文书
广告宣传策划方案
2014/05/21 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
学期个人工作总结
2015/02/13 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
银行催款通知书
2015/04/17 职场文书