函数声明不是函数式编程的充分条件,但能支撑纯函数、不可变数据与高阶函数:需避免副作用、显式传参、返回新值;可实现map、add等高阶函数;宜拆解为小函数组合;局限在于非表达式、无法匿名、提升可能影响递归。

函数声明本身不是函数式编程的充分条件,但它可以成为实现函数式编程风格的重要基础工具。关键不在于“用函数声明”,而在于如何用它来支持纯函数、不可变数据、高阶函数等核心思想。
用函数声明定义纯函数
纯函数要求相同输入始终返回相同输出,且不产生副作用。函数声明天然适合封装这类逻辑:
- 避免在函数体内修改外部变量或全局状态
- 所有依赖都通过参数显式传入,不读取闭包外可变数据
- 返回新值而非修改原值(例如用
[...arr, item]代替arr.push(item))
借助函数声明实现高阶函数
函数式编程常把函数当值传递或返回。函数声明可清晰表达这种意图:
- 声明一个接收函数作为参数的函数,如
function map(fn, arr) { return arr.map(fn); } - 声明一个返回函数的函数,如
function add(x) { return function(y) { return x + y; }; } - 注意:函数声明会被提升,但若需动态生成或依赖运行时环境,箭头函数或函数表达式可能更灵活
用函数声明组织不可变操作链
将复杂逻辑拆解为多个小而专注的函数声明,再组合使用,符合函数式“组合优于嵌套”的原则:
- 每个函数只做一件事,比如
filterEven、double、sum - 组合时可用简单调用或管道式写法(需自行实现或借助工具),如
sum(double(filterEven([1,2,3,4]))) - 避免在函数内直接修改传入的对象或数组,总是返回新结构
注意函数声明的局限性
函数式编程强调表达式和组合,而函数声明是语句形式,在某些场景下不如函数表达式或箭头函数自然:
- 无法直接用于对象方法简写或数组方法回调(如
arr.map(function(x){...})不如arr.map(x => ...)简洁) - 不能匿名,不利于临时、一次性逻辑的封装
- 作用域和提升行为有时会干扰预期执行顺序,尤其在递归或依赖声明顺序时需谨慎










