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 相关文章推荐
自动更新作用
Oct 08 Javascript
PHP开发者必须掌握的6个关键字
Apr 14 Javascript
javascript定时器完整实例
Feb 10 Javascript
js简单工厂模式用法实例
Jun 30 Javascript
JavaScript实现Base64编码转换
Apr 23 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
详细讲解vue2+vuex+axios
May 27 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
vue环形进度条组件实例应用
Oct 10 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
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 simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
php实现微信发红包功能
2018/07/13 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
Python迭代器与生成器基本用法分析
2018/07/26 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
口腔医学技术应届生求职信
2013/11/09 职场文书
土地转让协议书范本
2014/04/15 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
2014年党务工作总结
2014/11/25 职场文书
先进教师个人总结
2015/02/11 职场文书
css3新特性的应用示例分析
2022/03/16 HTML / CSS