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 对象成员的可见性说明
Oct 16 Javascript
JavaScript对象创建及继承原理实例解剖
Feb 28 Javascript
根据选择不同的下拉值出现相对应的文本输入框
Aug 01 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
vue中element组件样式修改无效的解决方法
Feb 03 Javascript
Vue实现点击后文字变色切换方法
Feb 11 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 Javascript
微信小程序在其他页面监听globalData中值的变化
Jul 15 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
Sep 02 Javascript
layer页面跳转,获取html子节点元素的值方法
Sep 27 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
如何将数据从文本导入到mysql
2006/10/09 PHP
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
常用python编程模板汇总
2016/02/12 Python
python实现杨辉三角思路
2017/07/14 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python3的socket使用方法详解
2020/02/18 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
幼儿园大班新学期寄语
2014/01/18 职场文书
会计专业求职信
2014/08/10 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
庆七一主持词
2015/06/29 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL