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 textarea自动增高并隐藏滚动条
Dec 16 Javascript
分享一个asp.net pager分页控件
Jan 04 Javascript
jQuery弹性滑动导航菜单实现思路及代码
May 02 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
Aug 05 Javascript
jQuery中trigger()与bind()用法分析
Dec 18 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
Bootstrap 模态框(Modal)带参数传值实例
Aug 20 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
详解vue的数据劫持以及操作数组的坑
Apr 18 Javascript
JavaScript中EventBus实现对象之间通信
Oct 18 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
php while循环得到循环次数
2013/10/26 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
PHP中SESSION过期设置
2021/03/09 PHP
javascript中字符串的定义示例代码
2013/12/19 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
python解析基于xml格式的日志文件
2017/02/25 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
详解python中各种文件打开模式
2020/01/19 Python
python SOCKET编程基础入门
2021/02/27 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
办理生育手续介绍信
2014/01/14 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
诚实守信演讲稿
2014/09/01 职场文书
工作经验交流材料
2014/12/30 职场文书
蜗居观后感
2015/06/11 职场文书