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类和继承 constructor属性
Mar 04 Javascript
Safari5中alert的无限循环BUG
Apr 07 Javascript
jquery 获取标签名(tagName)示例代码
Jul 11 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 Javascript
Javascript动画效果(3)
Oct 11 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
May 18 Javascript
详解vue父子组件间传值(props)
Jun 29 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
Oct 31 Javascript
浅谈Webpack 持久化缓存实践
Mar 22 Javascript
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
JS严格模式原理与用法实例分析
Apr 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
用PHP实现验证码功能
2006/10/09 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python如何读写二进制数组数据
2020/08/01 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
实习生自荐信范文分享
2013/11/27 职场文书
小学生打架检讨书
2014/01/26 职场文书
会计岗位说明书
2014/07/29 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
秋菊打官司观后感
2015/06/03 职场文书
如何拟写通知正文?
2019/04/02 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
Python天气语音播报小助手
2021/09/25 Python
Python借助with语句实现代码段只执行有限次
2022/03/23 Python