JavaScript学习笔记之惰性函数示例详解


Posted in Javascript onAugust 27, 2017

前言

本文主要给大家介绍了关于JavaScript惰性函数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

需求

我们现在需要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。

解决一:普通方法

var t;
function foo() {
 if (t) return t;
 t = new Date()
 return t;
}

问题有两个,一是污染了全局变量,二是每次调用 foo 的时候都需要进行一次判断。

解决二:闭包

我们很容易想到用闭包避免污染全局变量。

var foo = (function() {
 var t;
 return function() {
 if (t) return t;
 t = new Date();
 return t;
 }
})();

然而还是没有解决调用时都必须进行一次判断的问题。

解决三:函数对象

函数也是一种对象,利用这个特性,我们也可以解决这个问题。

function foo() {
 if (foo.t) return foo.t;
 foo.t = new Date();
 return foo.t;
}

依旧没有解决调用时都必须进行一次判断的问题。

解决四:惰性函数

不错,惰性函数就是解决每次都要进行判断的这个问题,解决原理很简单,重写函数。

var foo = function() {
 var t = new Date();
 foo = function() {
 return t;
 };
 return foo();
};

更多应用

DOM 事件添加中,为了兼容现代浏览器和 IE 浏览器,我们需要对浏览器环境进行一次判断:

// 简化写法
function addEvent (type, el, fn) {
 if (window.addEventListener) {
 el.addEventListener(type, fn, false);
 }
 else if(window.attachEvent){
 el.attachEvent('on' + type, fn);
 }
}

问题在于我们每当使用一次 addEvent 时都会进行一次判断。

利用惰性函数,我们可以这样做:

function addEvent (type, el, fn) {
 if (window.addEventListener) {
 addEvent = function (type, el, fn) {
  el.addEventListener(type, fn, false);
 }
 }
 else if(window.attachEvent){
 addEvent = function (type, el, fn) {
  el.attachEvent('on' + type, fn);
 }
 }
}

当然我们也可以使用闭包的形式:

var addEvent = (function(){
 if (window.addEventListener) {
 return function (type, el, fn) {
  el.addEventListener(type, fn, false);
 }
 }
 else if(window.attachEvent){
 return function (type, el, fn) {
  el.attachEvent('on' + type, fn);
 }
 }
})();

当我们每次都需要进行条件判断,其实只需要判断一次,接下来的使用方式都不会发生改变的时候,想想是否可以考虑使用惰性函数。

重要参考

Lazy Function Definition Pattern

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 单选框,多选框美化代码
Aug 01 Javascript
jQuery 入门级学习笔记及源码
Jan 22 Javascript
Javascript 面向对象编程(一) 封装
Aug 28 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
May 08 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
Sep 22 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
vue使用axios实现文件上传进度的实时更新详解
Dec 20 Javascript
javascript中的replace函数(带注释demo)
Jan 07 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
打通前后端构建一个Vue+Express的开发环境
Jul 17 Javascript
用javascript实现倒计时效果
Feb 09 Javascript
Vue实现typeahead组件功能(非常靠谱)
Aug 26 #Javascript
vue下跨域设置的相关介绍
Aug 26 #Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 #Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 #Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 #Javascript
js实现本地时间同步功能
Aug 26 #Javascript
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 #jQuery
You might like
cmd下运行php脚本
2008/11/25 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
php简单实现数组分页的方法
2016/04/30 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
JavaScript的Cookies
2008/01/16 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
房屋维修协议书范本
2014/09/25 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python