JS设计模式之惰性模式(二)


Posted in Javascript onSeptember 29, 2017

惰性模式:减少代码每次执行时的重复性判断,通过重新定义对象来避免原对象中的分支判断,提高网站性能。

例如针对不同浏览器的事件注册方法:

var AddEvent = function(dom, type, fn){
 if(dom.addEventListener){
 dom.addEventListener(type, fn, false);
 }else if(dom.attachEvent){
 dom.attachEvent('on'+type, fn);
 }else{
 dom['on'+type] = fn;
 }
}

从上面的方法可以发现,每次为元素绑定事件时,都会进行检测判断,这是多余的,因为在同一浏览器中分支判断结果是唯一的,不可能走不同的分支。

我们可以用惰性模式来解决这个问题,既然第一次调用该方法时已经判断过了,那么就可以在第一次执行时根据判断结果重新定义该方法。

惰性模式主要有两种实现方法:

加载即执行:JavaScript文件加载时通过闭包执行对方法进行重新定义,在页面加载时会消耗一定的资源。

var AddEvent = function(dom, type, fn){
 if(dom.addEventListener){
return function(dom, type, fn){
 dom.addEventListener(type, fn, false);
 }
 }else if(dom.attachEvent){
return function(dom, type, fn){
 dom.attachEvent('on'+type, fn);
 }
 }else{
return function(dom, type, fn){
 dom['on'+type] = fn;
 }
 }
}();

惰性执行:第一次执行函数时在函数内部对其进行显示重写,最后调用重写后的方法完成第一次方法调用。

var AddEvent = function(dom, type, fn){
 if(dom.addEventListener){
AddEvent = function(dom, type, fn){
 dom.addEventListener(type, fn, false);
 }
 }else if(dom.attachEvent){
AddEvent = function(dom, type, fn){
 dom.attachEvent('on'+type, fn);
 }
 }else{
AddEvent = function(dom, type, fn){
 dom['on'+type] = fn;
 }
 }
 AddEvent(dom, type, fn);
};

加载即执行不同的是,JS文件加载完成后,惰性执行的函数还没有被重新定义,当函数被首次调用时才会被重定义。这两种惰性方式都避免了冗余的分支判断。

惰性模式的应用场景非常广泛,特别是当今浏览器种类繁多的现象,很多功能在不同浏览器中实现不一,为了兼容不同的浏览器,代码中往往会有许多对不同浏览器的分支判断,比如事件处理、XMLHttpRequest对象创建等,造成代码臃肿冗余,惰性模式正好可以解决这种问题,提高代码执行效率。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
深入讲解AngularJS中的自定义指令的使用
Jun 18 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
简介AngularJS中$http服务的用法
Feb 06 Javascript
老生常谈JavaScript数组的用法
Jun 10 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
Nov 07 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
详解关于vue2.0工程发布上线操作步骤
Sep 27 Javascript
Jquery实现无缝向上循环滚动列表的特效
Feb 13 jQuery
jQuery实时统计输入框字数及限制
Jun 24 jQuery
antd table按表格里的日期去排序操作
Nov 17 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
Aug 09 #Javascript
详解用Node.js实现Restful风格webservice
Sep 29 #Javascript
实现一个完整的Node.js RESTful API的示例
Sep 29 #Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 #jQuery
vue axios同步请求解决方案
Sep 29 #Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 #Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
Sep 29 #Javascript
You might like
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
PHP加密解密类实例代码
2016/07/20 PHP
Prototype Array对象 学习
2009/07/19 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
基于python检查矩阵计算结果
2020/05/21 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
英国网上购买门:Direct Doors
2018/06/07 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
计算机专业个人求职信范例
2013/09/23 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
销售竞赛活动方案
2014/08/23 职场文书
优秀教师个人材料
2014/12/15 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
python画条形图的具体代码
2022/04/20 Python
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL