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面向对象设计一 工厂模式
Dec 20 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
javascript最基本的函数汇总
Jun 25 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
Mar 28 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
JavaScript制作简易计算器(不用eval)
Feb 05 Javascript
详解Node.js 命令行程序开发教程
Jun 07 Javascript
详解Vue.js分发之作用域槽
Jun 13 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 Javascript
在vue中给后台接口传的值为数组的格式代码
Nov 12 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
Nov 16 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 array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
php汉字转拼音的示例
2014/02/27 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
JavaScript 继承的实现
2009/07/09 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
会计学专业学生的求职信范文
2014/01/27 职场文书
员工培训邀请函
2014/02/02 职场文书
投资合作协议书范本
2014/04/17 职场文书
节能环保标语
2014/06/12 职场文书
学校开学标语
2014/10/06 职场文书