如何将延迟处理解析JavaScript惰性编程改写成长尾?

2026-04-02 23:051阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计987个文字,预计阅读时间需要4分钟。

如何将延迟处理解析JavaScript惰性编程改写成长尾?

目录- 前文回顾- 延迟处理- 惰性求值- 惰性编程- Generator-Thunk- 迭代生成器- 循环- 请求- 无限序列- 结尾- 前文回顾

目录
  • 前文回顾
  • 延迟处理
  • 惰性求值
  • 惰性编程
  • Generator
    • Thunk
    • 迭代生成器
    • 循环+请求
    • 无限序列
  • 结语

    前文回顾

    # ✨从历史讲起,JavaScript 基因里写着函数式编程

    # ✨从柯里化讲起,一网打尽 JavaScript 重要的高阶函数

    # ✨从纯函数讲起,一窥最深刻的函子 Monad

    我们从闭包起源开始、再到百变柯里化等一票高阶函数,再讲到纯函数、纯函数的组合以及简化演算;

    学到了:

    • 闭包的设计就是因为 lambda 表达式只能接受一个参数的设计导致的,诞生 1930 ;
    • 柯里化是闭包的孪生子,柯里化思想是高阶函数的重要指导;
    • 原来编程函数也可以和数学函数一样运算推导,无副作用的纯函数、函数组合,代码更易读;

    本篇将展开“延迟处理”这一话题,闲言少叙,冲了~

    延迟处理

    认真读前面几篇,虽然没有专门讲“延迟处理”,但实际上处处都体现着“延迟处理”。

    首先闭包是延迟处理:函数在声明的时候,确定了上下作用域关系。比如以下代码:

    function addA(A){ return function(B){ return B+A } } let count = addA(7) console.log(count(8)) // 15

    调用 addA(7) 函数,它说:我并不会执行运算,而会返回给你一个新的函数,以及一个“闭包”,这个闭包里面是被引用的变量值。等到时候你要计算的时候,再从这里面拿值就行了~

    其次,柯里化和闭包同宗同源,由 add(1,2,3) 柯里化为 add(1)(2)(3)(),在判定最后的参数为空之前,都是一个待执行的函数,不会进行真正的运算处理。

    function addCurry() { let arr = [...arguments] let fn = function () { if(arguments.length === 0) { return arr.reduce((a, b) => a + b) // 当参数为空时才执行求和计算; } else { arr.push(...arguments) return fn } } return fn }

    接着,纯函数中,我们不能保证一直写出不带副作用的函数,HTTP 操作/ IO 操作/ DOM 操作等这些行为是业务场景必做的,于是想了个法子:用一个“盒子”把不纯的函数包裹住,然后一个盒子连着一个盒子声明调用关系,直到最后执行 monad.value() 时才会暴露出副作用,尽最大可能的限制住了副作用的影响,延迟了它的影响。

    如何将延迟处理解析JavaScript惰性编程改写成长尾?

    所以,“延迟处理”思想几乎是根植在函数式编程的每一个要点中~

    还没完,从专栏的整体角度来看,至此行文已到中段,除了围绕“闭包”这一核心点,另外一个核心点“异步”也要逐渐拉开帷幕、闪亮登场。

    延迟处理是在函数式编程背景下连接 JavaScript 闭包和异步两大核心的重要桥梁。

    惰性求值

    “延迟处理”在函数式编程语言中还有一个更加官方、学术的名称,即“惰性求值”。

    本文共计987个文字,预计阅读时间需要4分钟。

    如何将延迟处理解析JavaScript惰性编程改写成长尾?

    目录- 前文回顾- 延迟处理- 惰性求值- 惰性编程- Generator-Thunk- 迭代生成器- 循环- 请求- 无限序列- 结尾- 前文回顾

    目录
    • 前文回顾
    • 延迟处理
    • 惰性求值
    • 惰性编程
    • Generator
      • Thunk
      • 迭代生成器
      • 循环+请求
      • 无限序列
    • 结语

      前文回顾

      # ✨从历史讲起,JavaScript 基因里写着函数式编程

      # ✨从柯里化讲起,一网打尽 JavaScript 重要的高阶函数

      # ✨从纯函数讲起,一窥最深刻的函子 Monad

      我们从闭包起源开始、再到百变柯里化等一票高阶函数,再讲到纯函数、纯函数的组合以及简化演算;

      学到了:

      • 闭包的设计就是因为 lambda 表达式只能接受一个参数的设计导致的,诞生 1930 ;
      • 柯里化是闭包的孪生子,柯里化思想是高阶函数的重要指导;
      • 原来编程函数也可以和数学函数一样运算推导,无副作用的纯函数、函数组合,代码更易读;

      本篇将展开“延迟处理”这一话题,闲言少叙,冲了~

      延迟处理

      认真读前面几篇,虽然没有专门讲“延迟处理”,但实际上处处都体现着“延迟处理”。

      首先闭包是延迟处理:函数在声明的时候,确定了上下作用域关系。比如以下代码:

      function addA(A){ return function(B){ return B+A } } let count = addA(7) console.log(count(8)) // 15

      调用 addA(7) 函数,它说:我并不会执行运算,而会返回给你一个新的函数,以及一个“闭包”,这个闭包里面是被引用的变量值。等到时候你要计算的时候,再从这里面拿值就行了~

      其次,柯里化和闭包同宗同源,由 add(1,2,3) 柯里化为 add(1)(2)(3)(),在判定最后的参数为空之前,都是一个待执行的函数,不会进行真正的运算处理。

      function addCurry() { let arr = [...arguments] let fn = function () { if(arguments.length === 0) { return arr.reduce((a, b) => a + b) // 当参数为空时才执行求和计算; } else { arr.push(...arguments) return fn } } return fn }

      接着,纯函数中,我们不能保证一直写出不带副作用的函数,HTTP 操作/ IO 操作/ DOM 操作等这些行为是业务场景必做的,于是想了个法子:用一个“盒子”把不纯的函数包裹住,然后一个盒子连着一个盒子声明调用关系,直到最后执行 monad.value() 时才会暴露出副作用,尽最大可能的限制住了副作用的影响,延迟了它的影响。

      如何将延迟处理解析JavaScript惰性编程改写成长尾?

      所以,“延迟处理”思想几乎是根植在函数式编程的每一个要点中~

      还没完,从专栏的整体角度来看,至此行文已到中段,除了围绕“闭包”这一核心点,另外一个核心点“异步”也要逐渐拉开帷幕、闪亮登场。

      延迟处理是在函数式编程背景下连接 JavaScript 闭包和异步两大核心的重要桥梁。

      惰性求值

      “延迟处理”在函数式编程语言中还有一个更加官方、学术的名称,即“惰性求值”。