Jamey's Jamey's
首页
导航站
  • 学习专栏

    • 《HTML》笔记
    • 《CSS》笔记
    • 《JavaScript》笔记
    • 《Vue》笔记
    • 《Git》笔记
    • 《规范》笔记
    • 《软技能》笔记
    • 《面试》笔记
    • 《持续集成&交付&部署》笔记
  • 踩坑专栏

    • 《Element-UI 实践系列》笔记
    • 《移动端 实践系列》笔记
    • 《综合》笔记
  • 配置专栏

    • 《环境系列》笔记
  • 极空间

    • Docker
  • 影视

    • movie
  • 编辑器笔记

    • 开发编辑器
  • 浏览器笔记

    • Chrome
  • Mac笔记

    • Mac
  • 跨界学习

    • 运营
  • 破解合集

    • 破解
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 书单
    • 关于

Jamey

首页
导航站
  • 学习专栏

    • 《HTML》笔记
    • 《CSS》笔记
    • 《JavaScript》笔记
    • 《Vue》笔记
    • 《Git》笔记
    • 《规范》笔记
    • 《软技能》笔记
    • 《面试》笔记
    • 《持续集成&交付&部署》笔记
  • 踩坑专栏

    • 《Element-UI 实践系列》笔记
    • 《移动端 实践系列》笔记
    • 《综合》笔记
  • 配置专栏

    • 《环境系列》笔记
  • 极空间

    • Docker
  • 影视

    • movie
  • 编辑器笔记

    • 开发编辑器
  • 浏览器笔记

    • Chrome
  • Mac笔记

    • Mac
  • 跨界学习

    • 运营
  • 破解合集

    • 破解
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 书单
    • 关于
  • 深入系列

  • 专题系列

    • 写在前面
    • JavaScript 专题之跟着 underscore 学防抖
    • JavaScript 专题之跟着 underscore 学节流
    • JavaScript 专题之数组去重
    • JavaScript 专题之类型判断(上)
    • JavaScript 专题之类型判断(下)
    • JavaScript 专题之深浅拷贝
    • JavaScript 专题之从零实现 jQuery 的 extend
    • JavaScript 专题之如何求数组的最大值和最小值
    • JavaScript 专题之数组扁平化
    • JavaScript 专题之学 underscore 在数组中查找指定元素
    • JavaScript 专题之 jQuery 通用遍历方法 each 的实现
    • JavaScript 专题之如何判断两个对象相等
    • JavaScript 专题之函数柯里化
    • JavaScript 专题之偏函数
    • JavaScript 专题之惰性函数
      • 📖. 需求
      • 一. 解决一:普通方法
      • 二. 解决二:闭包
      • 三. 解决三:函数对象
      • 四. 解决四:惰性函数
      • 五. 更多应用
      • 六. 重要参考
    • JavaScript 专题之函数组合
    • JavaScript 专题之函数记忆
    • JavaScript 专题之递归
    • JavaScript 专题之乱序
    • JavaScript 专题之解读 v8 排序源码
  • underscore系列

  • ES6系列

  • 模块化

  • 正则表达式

  • 单元测试

  • 微前端

  • 实用函数

  • Rollup

  • 解决方案

  • 《JavaScript》笔记
  • 专题系列
Jamey
2021-11-04
目录

JavaScript 专题之惰性函数

# JavaScript 专题之惰性函数

# 📖. 需求

我们现在需要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。

# 一. 解决一:普通方法

var t;
function foo() {
  if (t) return t;
  t = new Date();
  return t;
}
1
2
3
4
5
6

问题有两个,一是污染了全局变量,二是每次调用 foo 的时候都需要进行一次判断。

# 二. 解决二:闭包

我们很容易想到用闭包避免污染全局变量。

var foo = function() {
  var t;
  return function() {
    if (t) return t;
    t = new Date();
    return t;
  }
}
1
2
3
4
5
6
7
8

然而还是没有解决调用时都必须进行一次判断的问题。

# 三. 解决三:函数对象

函数也是一种对象,利用这个特性,我们也可以解决这个问题。

function foo() {
  if (foo.t) return foo.t;
  foo.t = new Date();
  return foo.t;
}
1
2
3
4
5

依旧没解决调用时都必须进行一次判断的问题。

# 四. 解决四:惰性函数

不错,惰性函数就是解决每次都要进行判断的这个问题,解决原理很简单,重写函数。

var foo = function() {
  var t = new Date();
  foo = function() {
    return t;
  };
  return foo();
}
1
2
3
4
5
6
7

# 五. 更多应用

DOM 事件添加中,为了兼容现在浏览器和 IE 浏览器,我们需要对浏览器环境进行一次判断:

// 简化写法
function addEvent(type, el, fn) {
  if(window.addEventListener) {
    el.addEventListener(type, fn, false);
  }
  else if(window.attachEvent) {
    el.attachEvent('on' + type, fn);
  }
}
1
2
3
4
5
6
7
8
9

问题在于我们每当使用一次 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);
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

当然我们也可以使用闭包的形式:

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);
    }
  }
})();
1
2
3
4
5
6
7
8
9
10
11
12

当我们每次都需要进行条件判断,其实只需要判断一次,接下来的使用方式都不会发生改变的时候,想想是否可以考虑使用惰性函数。

# 六. 重要参考

Lazy Function Definition Pattern (opens new window)

#JavaScript 专题
上次更新: 2022/07/01, 17:34:19
JavaScript 专题之偏函数
JavaScript 专题之函数组合

← JavaScript 专题之偏函数 JavaScript 专题之函数组合→

Theme by Vdoing | Copyright © 2017-2023 Jamey | blog 闽ICP备19022664号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式