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 相关文章推荐
摘自启点的main.js
Apr 20 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
Dec 12 Javascript
JS的replace方法介绍
Oct 20 Javascript
js函数返回多个返回值的示例代码
Nov 05 Javascript
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
ECMAScript6函数默认参数
Jun 12 Javascript
jquery与ajax获取特殊字符实例详解
Jan 08 Javascript
AngularJS实现页面定时刷新
Mar 14 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
Dec 11 Javascript
Vue发布订阅模式实现过程图解
Apr 30 Javascript
Vue的Options用法说明
Aug 14 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中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
python pygame实现五子棋小游戏
2020/10/26 Python
对python中各个response的使用说明
2020/03/28 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
进步之星获奖感言
2014/02/22 职场文书
文明寝室申报材料
2014/05/12 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
个人合作协议范本
2015/08/06 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers