推荐答案
纯函数是指一个函数的输出完全由其输入决定,并且在执行过程中不会产生任何副作用的函数。
它具有以下两个核心特点:
- 相同的输入永远产生相同的输出 (Referential Transparency): 给定相同的参数,纯函数总是返回相同的结果。 函数的输出只依赖于输入的参数,而不依赖于外部状态或其他变量。
- 无副作用 (No Side Effects): 纯函数在执行过程中不会修改外部状态(例如全局变量、DOM、传入的对象等),不会产生如打印日志、网络请求、文件写入等行为。
本题详细解读
纯函数的概念
纯函数是函数式编程中的一个核心概念。它强调函数的行为应该像数学函数一样,只根据输入计算输出,而没有任何额外的行为。这种特性使得纯函数易于理解、测试和组合,是构建可维护、可预测的软件的重要组成部分。
纯函数的两个核心特点详解
1. 相同的输入永远产生相同的输出 (Referential Transparency)
- 概念解释:
- 确定性: 纯函数就像一个黑盒,你只要给它相同的输入,它就一定会吐出相同的输出,不会有任何意外。
- 可缓存性: 由于输出只依赖于输入,我们可以利用这个特性对纯函数进行缓存(memoization)。如果下次遇到相同的输入,可以直接返回缓存的结果,而不用再次计算,从而提高性能。
- 示例说明:
-- -------------------- ---- ------- -- ----- -------- ------ -- - ------ - - -- - -- ------ --- ----- - -- -------- ------------ - ----- -- -- ------ ------ - ------------------ ---- -- -- - ------------------ ---- -- -- - ------------- -------------------------- -- -- - -------------------------- -- -- - -------------
add
函数是纯函数,因为相同的输入 (2, 3) 总是产生相同的输出 5。impureAdd
函数不是纯函数,因为它的输出依赖于外部变量count
,相同的输入2
产生了不同的输出。
2. 无副作用 (No Side Effects)
- 概念解释:
- 状态不变性: 纯函数不应该修改任何外部状态。这意味着它不会改变全局变量、DOM 元素、传入的对象或执行其他会影响程序外部环境的操作。
- 易于推理: 由于没有副作用,我们可以更容易地理解和调试纯函数。只需要关注输入和输出,而无需担心函数会意外地影响其他部分的代码。
- 常见副作用示例:
- 修改全局变量
- 修改函数参数(尤其是对象和数组)
- 执行 DOM 操作
- 发送 HTTP 请求
- 打印日志
- 读取或写入文件
- 调用其他非纯函数
- 示例说明:
-- -------------------- ---- ------- -- ----- -------- -------------- ------ ---- - ------ ---------------- ----- - -- ------ -------- --------------- -------- - ------------------ -- ------ ------ ---- - ----- ----------- - --- -- --- ----- --------- - ---------------------- -- --- ------------------------- -- -- --- -- -- -------- ----------------------- -- -- --- -- ----- ------------ - --- -- --- ----- --------- - ------------------------ --- -------------------------- -- -- --- -- -- -- -------- ----------------------- -- -- --- -- -- --
pureSlice
函数是纯函数,因为它返回一个新的数组,而不会修改原始数组originalArr
。impurePush
函数不是纯函数,因为它直接修改了传入的数组originalArr2
,产生了副作用。