利用函数的惰性载入提高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 控制input只允许输入的各种指定内容
Jun 19 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
一次记住JavaScript的6个正则表达式方法
Feb 22 Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
Vue实现开心消消乐游戏算法
Oct 22 Javascript
vue项目初始化到登录login页面的示例
Oct 31 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 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序列化操作方法分析
2016/09/28 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
Python二分法搜索算法实例分析
2015/05/11 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
Python对象与引用的介绍
2019/01/24 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
中科创达面试题
2016/12/28 面试题
学校后勤人员职责
2013/12/27 职场文书
自动一体化专业求职信
2014/03/15 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
铅球加油稿100字
2014/09/26 职场文书
工作经历证明书范文
2014/11/02 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
心术观后感
2015/06/11 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android