利用函数的惰性载入提高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 匿名调用实现代码
Jun 19 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
与Math.pow 相反的函数使用介绍
Aug 04 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
JQuery中clone方法复制节点
May 18 Javascript
JS拖拽组件学习使用
Jan 19 Javascript
javascript中sort排序实例详解
Jul 24 Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 Javascript
JavaScript实现各种排序的代码详解
Aug 28 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
Jul 15 Javascript
Node.js中出现未捕获异常的处理方法
Jun 29 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 5.3.0 安装分析心得
2009/08/07 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php格式化电话号码的方法
2015/04/24 PHP
php验证手机号码
2015/11/11 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
angular分页指令操作
2017/01/09 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
Python实现队列的方法
2015/05/26 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
女大学生个人求职信
2013/12/09 职场文书
大学生找工作求职信
2014/07/09 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android