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 相关文章推荐
Javascript改变CSS样式(局部和全局)
Dec 18 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
Nov 05 Javascript
轻松实现javascript数据双向绑定
Nov 11 Javascript
jQuery控制frames及frame页面JS的方法
Mar 08 Javascript
原生JS实现平滑回到顶部组件
Mar 16 Javascript
jQuery根据表单name获取值的方法
May 24 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
Sep 18 Javascript
AngularJs实现聊天列表实时刷新功能
Jun 15 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 Javascript
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 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
PHP session会话的安全性分析
2011/09/08 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
php生成动态验证码gif图片
2015/10/19 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
Python实现单词拼写检查
2015/04/25 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
深入浅析python with语句简介
2018/04/11 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
Python实现微信小程序支付功能
2019/07/25 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
Python更新所有已安装包的操作
2020/02/13 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
python 实现波浪滤镜特效
2020/12/02 Python
网吧消防安全制度
2014/01/28 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
老公保证书
2015/01/17 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
mysql数据库如何转移到oracle
2022/12/24 MySQL