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