请解释什么是纯函数 (Pure Function),它具有哪些特点?

推荐答案

纯函数是指一个函数的输出完全由其输入决定,并且在执行过程中不会产生任何副作用的函数。

它具有以下两个核心特点:

  1. 相同的输入永远产生相同的输出 (Referential Transparency): 给定相同的参数,纯函数总是返回相同的结果。 函数的输出只依赖于输入的参数,而不依赖于外部状态或其他变量。
  2. 无副作用 (No Side Effects): 纯函数在执行过程中不会修改外部状态(例如全局变量、DOM、传入的对象等),不会产生如打印日志、网络请求、文件写入等行为。

本题详细解读

纯函数的概念

纯函数是函数式编程中的一个核心概念。它强调函数的行为应该像数学函数一样,只根据输入计算输出,而没有任何额外的行为。这种特性使得纯函数易于理解、测试和组合,是构建可维护、可预测的软件的重要组成部分。

纯函数的两个核心特点详解

1. 相同的输入永远产生相同的输出 (Referential Transparency)

  • 概念解释:
    • 确定性: 纯函数就像一个黑盒,你只要给它相同的输入,它就一定会吐出相同的输出,不会有任何意外。
    • 可缓存性: 由于输出只依赖于输入,我们可以利用这个特性对纯函数进行缓存(memoization)。如果下次遇到相同的输入,可以直接返回缓存的结果,而不用再次计算,从而提高性能。
  • 示例说明:
    -- -------------------- ---- -------
    -- -----
    -------- ------ -- -
      ------ - - --
    -
    
    -- ------
    --- ----- - --
    -------- ------------ -
       ----- -- --
       ------ ------
    -
    
    ------------------ ---- -- -- -
    ------------------ ---- -- -- - -------------
    
    -------------------------- -- -- -
    -------------------------- -- -- - -------------
    add 函数是纯函数,因为相同的输入 (2, 3) 总是产生相同的输出 5。 impureAdd 函数不是纯函数,因为它的输出依赖于外部变量 count,相同的输入 2 产生了不同的输出。

2. 无副作用 (No Side Effects)

  • 概念解释:
    • 状态不变性: 纯函数不应该修改任何外部状态。这意味着它不会改变全局变量、DOM 元素、传入的对象或执行其他会影响程序外部环境的操作。
    • 易于推理: 由于没有副作用,我们可以更容易地理解和调试纯函数。只需要关注输入和输出,而无需担心函数会意外地影响其他部分的代码。
  • 常见副作用示例:
    • 修改全局变量
    • 修改函数参数(尤其是对象和数组)
    • 执行 DOM 操作
    • 发送 HTTP 请求
    • 打印日志
    • 读取或写入文件
    • 调用其他非纯函数
  • 示例说明:
    -- -------------------- ---- -------
    -- -----
    -------- -------------- ------ ---- -
        ------ ---------------- -----
    -
    
    -- ------
    -------- --------------- -------- -
        ------------------  -- ------
        ------ ----
    -
    
    ----- ----------- - --- -- ---
    ----- --------- - ---------------------- -- ---
    ------------------------- -- -- --- -- -- --------
    -----------------------    -- -- --- --
    
    ----- ------------ - --- -- ---
    ----- --------- - ------------------------ ---
    -------------------------- -- -- --- -- -- -- --------
    -----------------------    -- -- --- -- -- --
    pureSlice 函数是纯函数,因为它返回一个新的数组,而不会修改原始数组 originalArrimpurePush 函数不是纯函数,因为它直接修改了传入的数组 originalArr2,产生了副作用。
纠错
反馈