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 相关文章推荐
node.js中的http.response.getHeader方法使用说明
Dec 14 Javascript
javascript正则表达式总结
Feb 29 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
最全面的JS倒计时代码
Sep 17 Javascript
使用jquery如何获取时间
Oct 13 Javascript
Javascript vue.js表格分页,ajax异步加载数据
Oct 24 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
Mar 17 Javascript
Node.js 使用jade模板引擎的示例
May 11 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
Jquery Fade用法详解
Nov 06 jQuery
JS前端轻量fabric.js系列之画布初始化
Aug 05 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判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
php集成动态口令认证
2016/07/21 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python常用特殊方法实例总结
2019/03/22 Python
Python程序慢的重要原因
2020/09/04 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
药学专业个人的自我评价
2013/12/31 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
团结演讲稿范文
2014/05/23 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript