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鼠标划过切换效果
Jun 30 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
Feb 23 Javascript
jQuery点击弹出下拉菜单的小例子
Aug 01 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
详解vuex 中的 state 在组件中如何监听
May 23 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
Jun 29 Javascript
基于js中的原型(全面讲解)
Sep 19 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
Jan 15 Javascript
Js经典案例的实例代码
May 10 Javascript
三步搞定:Vue.js调用Android原生操作
Sep 07 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往XML中添加节点的方法
2015/03/12 PHP
详解php用static方法的原因
2018/09/12 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
Js中sort()方法的用法
2006/11/04 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
学习python可以干什么
2019/02/26 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
python opencv调用笔记本摄像头
2019/08/28 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
为什么相对PHP黑python的更少
2020/06/21 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
2014幼儿园保育员工作总结
2014/11/10 职场文书
新学期感想
2015/08/10 职场文书