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使用正则表达式实现关键字替换加粗功能示例
Aug 03 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
Feb 13 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 Javascript
JavaScript类的继承操作实例总结
Dec 20 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 Javascript
webgl实现物体描边效果的方法介绍
Nov 27 Javascript
Vue自定义组件双向绑定实现原理及方法详解
Sep 03 Javascript
openlayers4.6.5实现距离量测和面积量测
Sep 25 Javascript
js仿淘宝放大镜效果
Dec 28 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
input的focus方法使用
2010/03/13 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
工商管理应届生求职信
2013/10/07 职场文书
受欢迎的大学生自我评价
2013/12/05 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
西安导游词
2015/02/12 职场文书
安全责任协议书范本
2016/03/23 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书