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 模拟类搜索框自动完成搜索提示功能(改进)
May 24 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
jQuery随机切换图片的小例子
Apr 18 Javascript
js页面跳转的常用方法整理
Oct 18 Javascript
jquery实现弹出层完美居中效果
Mar 03 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
基于JavaScript实现复选框的全选和取消全选
Feb 09 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
Require.js的基本用法详解
Jul 03 Javascript
Vue中使用的EventBus有生命周期
Jul 12 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
Sep 11 Javascript
用jQuery实现抽奖程序
Apr 12 jQuery
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中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
php获取网页内容方法总结
2008/12/04 PHP
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
php模板中出现空行解决方法
2011/03/08 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
python将ip地址转换成整数的方法
2015/03/17 Python
Python基于DES算法加密解密实例
2015/06/03 Python
python开发中range()函数用法实例分析
2015/11/12 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
拓展培训心得体会
2014/01/04 职场文书
预备党员政审材料
2014/02/04 职场文书
房地产项目策划书
2014/02/05 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
慈善晚会策划方案
2014/05/14 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
大学体育课感想
2015/08/10 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技