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帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
js post提交调用方法
Feb 12 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
JavaScript Split()方法
Dec 18 Javascript
js编写三级联动简单案例
Dec 21 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
JavaScript通过filereader接口读取文件
May 10 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
May 11 Javascript
Bootstrap fileinput文件上传预览插件使用详解
May 16 Javascript
原生js实现密码输入框值的显示隐藏
Jul 17 Javascript
Vue 框架之动态绑定 css 样式实例分析
Nov 14 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 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读取html并截取字符串的简单代码
2009/11/30 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
详解php命令注入攻击
2019/04/06 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
Vue组件化开发思考
2018/02/02 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
python实现的汉诺塔算法示例
2019/10/23 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
Mysql数据库group by原理详解
2022/07/07 MySQL