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实现权限树的更新权限时的全选全消功能
Feb 17 Javascript
Javascript 判断客户端浏览器类型代码
Mar 01 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
JQuery.Ajax之错误调试帮助信息介绍
Jul 04 Javascript
JavaScript中的this关键字使用详解
Aug 14 Javascript
图解js图片轮播效果
Dec 20 Javascript
JavaScript实现页面无操作倒计时退出
Oct 22 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
微信小程序实现商品属性联动选择
Feb 15 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
element中el-container容器与div布局区分详解
May 13 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
第十二节--类的自动加载
2006/11/16 PHP
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
关于svn冲突的解决方法
2013/06/21 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
python获取Linux发行版名称
2019/08/30 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
抽象类和接口的区别
2012/09/19 面试题
优秀中专生推荐信
2013/11/17 职场文书
音乐专业自荐信
2014/02/07 职场文书
勤俭节约倡议书
2014/04/14 职场文书
学校安全责任书
2014/04/14 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
复兴之路观后感
2015/06/02 职场文书
陪护人员误工证明
2015/06/24 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS