JavaScript 纯函数
在学习JavaScript函数的过程中,你可能会听到"纯函数"这个术语。纯函数是函数式编程的核心概念之一,了解并掌握纯函数能够帮助你写出更加可靠、可测试和可维护的代码。本文将全面介绍纯函数的概念、特点、优势以及实际应用。
什么是纯函数?
纯函数是这样一种函数:
- 给定相同的输入,总是返回相同的输出
- 没有副作用(Side Effects)
这两个特性看似简单,但实际上蕴含着深刻的含义,它们使得纯函数在编程中具有极高的价值。
特性一:相同输入,相同输出
这意味着函数的返回结果仅取决于其参数,而不依赖于任何外部状态或数据。这种特性被称为引用透明性(Referential Transparency)。
来看一个简单的例子:
// 纯函数
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 输出: 5
console.log(add(2, 3)); // 输出: 5
无论何时调用add(2, 3)
,结果总是5
,这就是引用透明的体现。
特性二:没有副作用
副作用指的是函数除了返回值之外,还对外部环境产生了其他影响,例如:
- 修改全局变量或外部作用域中的变量
- 修改函数参数
- 执行I/O操作(如网络请求、文件读写等)
- 调用浏览器API(如
console.log
、alert
等) - DOM操作
纯函数应避免这些行为。
纯函数 vs 非纯函数
来看几个例子来区分纯函数和非纯函数:
纯函数示例
// 纯函数示例1: 计算圆的面积
function calculateCircleArea(radius) {
return Math.PI * radius * radius;
}
// 纯函数示例2: 将数组中的每个元素翻倍
function doubleNumbers(numbers) {
return numbers.map(num => num * 2);
}
非纯函数示例
// 非纯函数示例1: 依赖外部变量
let taxRate = 0.1;
function calculateTax(amount) {
return amount * taxRate; // 依赖外部变量taxRate
}
// 非纯函数示例2: 修改外部状态
let total = 0;
function addToTotal(value) {
total += value; // 修改外部变量
return total;
}
// 非纯函数示例3: 修改传入参数
function addItem(cart, item) {
cart.push(item); // 直接修改了传入的cart参数
return cart;
}