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 相关文章推荐
JQuery autocomplete 使用手册
Apr 01 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
jQuery中常用的遍历函数用法实例总结
Sep 01 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 Javascript
React Native时间转换格式工具类分享
Oct 24 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
Aug 02 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 Javascript
Ajax异步刷新功能及简单案例
Nov 20 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
PHP程序员编程注意事项
2008/04/10 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
PHP多进程简单实例小结
2019/11/09 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python elasticsearch环境搭建详解
2019/09/02 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
Python爬取某平台短视频的方法
2021/02/08 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
大学团支书的自我评价分享
2013/12/14 职场文书
相亲大会策划方案
2014/06/05 职场文书
药店采购员岗位职责
2014/09/30 职场文书
学习保证书100字
2015/02/26 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
Go语言 详解net的tcp服务
2022/04/14 Golang