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 相关文章推荐
EasyUI中的tree用法介绍
Nov 01 Javascript
ECMAScript 创建自己的js类库
Nov 22 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
Dec 15 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
深入理解JavaScript编程中的原型概念
Jun 25 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
Mar 07 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
angularjs+bootstrap实现自定义分页的实例代码
Jun 19 Javascript
Vue前端开发规范整理(推荐)
Apr 23 Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 Javascript
JS数组去重详情
Nov 07 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+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
php实现的双向队列类实例
2014/09/24 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
vue实现记事本功能
2019/06/26 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python中精确输出JSON浮点数的方法
2014/04/18 Python
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
python中reader的next用法
2018/07/24 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS