秒懂高阶编程之惰性函数

简介: 秒懂高阶编程之惰性函数

前言

高阶编程听起来很高大上,但只要你弄懂了,一切就豁然开朗。
我将会用接下来的几篇文章讲一下高阶编程的一些技巧。
今天要讲解的是高阶编程技巧的惰性函数,又称(惰性载入函数)。

首先什么是惰性(载入)函数?

惰性载入表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。

如果上面简述的定义让你难理解的话,我们看一个例子来理解一下。开发中我们总是会手写一个函数用于判断当前环境是哪种环境然后再执行相应环境下应该执行的代码(逻辑)。

下面是一个区分浏览器的兼容性来注册事件的一个函数,由于各浏览之间的差异,不得不用方法检测当前环境的能力,用以实现每种注册事件的方式。

function addEvent(type, element, fun) {
      if (element.addEventListener) {
        element.addEventListener(type, fun, false);
      }
      else if (element.attachEvent) {
        element.attachEvent('on' + type, fun);
      }
      else {
        element['on' + type] = fun;
      }
    }

从整体上看,上面的方法已经实现了区分了每种环境,但是实际上在同一环境中,分支其实走一次,做一回判断就可以了,不需要每次都要做一回判断。这样就引入了我们的惰性载入函数。惰性载入表示函数执行的分支仅会发生一次。实现惰性载入的方式有两种。第一种是在函数被调用的时候再处理函数。在第一次调用的过程中,该函数会被赋给为另一个按照合适方式执行的函数。这样任何对原函数的调用都不用在经过执行的分支了。方式一实现

function addEvent(type, element, fun) {
      if (element.addEventListener) {
        addEvent = function (type, element, fun) {
          element.addEventListener(type, fun, false);
        }
      }
      else if (element.attachEvent) {
        addEvent = function (type, element, fun) {
          element.attachEvent('on' + type, fun);
        }
      }
      else {
        addEvent = function (type, element, fun) {
          element['on' + type] = fun;
        }
      }
      addEvent(type, element, fun);
    }

第二种实现惰性载入的范式是在声明时就指定适当的函数,这样第一次调用是就不会损失性能了,而在代码首次加载时会损失一点性能。
方式二实现

function addEvent(type, element, fun) {
      if (element.addEventListener) {
        return function (type, element, fun) {
          element.addEventListener(type, fun, false);
        }
      }
      else if (element.attachEvent) {
        return function (type, element, fun) {
          element.attachEvent('on' + type, fun);
        }
      }
      else {
        return function (type, element, fun) {
          element['on' + type] = fun;
        }
      }
    }

参考

《JavaScript高级程序设计(第3版)》——第22章高阶技巧中惰性载入函数。

通过以上的方式希望你能对惰性(载入)函数有一定的理解。


听说分享关注的人都年薪百万了image.png

这里是前端扫地僧,和你一起分享前端的那些事。

相关文章
|
3月前
|
算法 程序员 编译器
尾递归和迭代的优缺点
【10月更文挑战第24天】在实际编程中,选择尾递归还是迭代往往取决于具体的问题和需求。有时候可以结合两者的优点,根据情况灵活运用。
|
7月前
|
存储 前端开发 Java
理解编程语言的严格和惰性计算
【7月更文挑战第13天】本文介绍惰性计算推迟了表达式求值,直到其值真正需要时才执行,从而优化性能,节省资源。在前端和并发编程中,懒加载和类似技术结合函数式编程特性,如 continuations,平衡了抽象与性能。
121 4
理解编程语言的严格和惰性计算
|
6月前
|
Python
Python函数式编程:你真的懂了吗?理解核心概念,实践高阶技巧,这篇文章带你一次搞定!
【8月更文挑战第6天】本文介绍了Python中的函数式编程,探讨了高阶函数、纯函数、匿名函数、不可变数据结构及递归等核心概念。通过具体示例展示了如何利用`map()`和`filter()`等内置函数处理数据,解释了纯函数的一致性和可预测性特点,并演示了使用`lambda`创建简短函数的方法。此外,文章还强调了使用不可变数据结构的重要性,并通过递归函数实例说明了递归的基本原理。掌握这些技巧有助于编写更清晰、模块化的代码。
76 3
|
6月前
|
存储 分布式计算 监控
|
7月前
|
开发者
编程问题之逻辑编程有什么缺点
编程问题之逻辑编程有什么缺点
|
7月前
|
编译器 程序员 C++
【C++高阶】掌握C++多态:探索代码的动态之美
【C++高阶】掌握C++多态:探索代码的动态之美
59 0
|
9月前
|
前端开发
高阶组件和高阶函数是什么
高阶组件和高阶函数是什么
75 0
|
9月前
|
前端开发 JavaScript 数据安全/隐私保护
第十一章 使用高阶函数和非高阶函数对组件进行优化
第十一章 使用高阶函数和非高阶函数对组件进行优化
|
缓存 Java 程序员
函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
本文会以惰性加载为例一步步介绍函数式编程中各种概念,所以读者不需要任何函数式编程的基础,只需要对 Java 8 有些许了解即可。
函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
|
存储 消息中间件 分布式计算
惰性函数|学习笔记
快速学习惰性函数。
189 0
惰性函数|学习笔记