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利用ajax调用后台方法实例
Aug 23 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 Javascript
Jquery动态添加及删除页面节点元素示例代码
Jun 16 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
Aug 27 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
JavaScript学习笔记之ES6数组方法
Mar 25 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 Javascript
Three.js快速入门教程
Sep 09 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
浅谈AngularJS中使用$resource(已更新)
Sep 14 Javascript
解决vue项目,npm run build后,报路径错的问题
Aug 13 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 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
索尼ICF-SW100收音机评测
2021/03/02 无线电
php4的session功能评述(一)
2006/10/09 PHP
基于mysql的论坛(7)
2006/10/09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
python处理按钮消息的实例详解
2017/07/11 Python
python中的变量如何开辟内存
2018/06/26 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python 自定义对象的打印方法
2019/01/12 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
营销与策划专业毕业生求职信
2013/11/01 职场文书
新农村建设汇报材料
2014/08/15 职场文书
关于颐和园的导游词
2015/01/30 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
同学聚会祝酒词
2015/08/10 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js