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 相关文章推荐
Jquery拖拽并简单保存的实现代码
Nov 28 Javascript
jQuery 获取URL的GET参数值的小例子
Apr 18 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
javascript中拼接HTML字符串的最快、最好的方法
Jun 07 Javascript
javascript控制在光标位置插入文字适合表情的插入
Jun 09 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
Javascript 关于基本类型和引用类型的个人理解
Nov 01 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 Javascript
vue实现员工信息录入功能
Jun 11 Javascript
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
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
重置版宣传动画
2020/04/09 魔兽争霸
PHP实现防盗链的方法分析
2017/07/25 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
python中异常报错处理方法汇总
2016/11/20 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
pytorch 常用线性函数详解
2020/01/15 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python Zmail模块简介与使用示例
2020/12/19 Python
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
办公室文书岗位职责
2013/12/16 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
实习生自我评价
2014/01/18 职场文书
行政司机岗位职责
2015/04/10 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
Redis 哨兵机制及配置实现
2022/03/25 Redis