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 相关文章推荐
BOM与DOM的区别分析
Oct 26 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
基于Bootstrap框架实现图片切换
Mar 10 Javascript
js实现多行文本框统计剩余字数功能
Mar 28 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
Oct 16 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 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/02/19 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
js 深拷贝函数
2008/12/04 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
Django中处理出错页面的方法
2015/07/15 Python
python如何在终端里面显示一张图片
2016/08/17 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
出纳的岗位职责
2013/11/09 职场文书
十一酒店活动方案
2014/02/20 职场文书
求职个人评价范文
2014/04/09 职场文书
2014年国庆标语
2014/06/30 职场文书
开发房地产协议书
2014/09/14 职场文书
小学班级口号大全
2015/12/25 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
一篇文章学会Vue中间件管道
2021/06/20 Vue.js