JavaScript函数式编程是用高阶函数、闭包和不可变数据思维组织代码的风格;纯函数要求相同输入必得相同输出且无副作用;map用于转换、filter用于筛选、reduce用于聚合;箭头函数非银弹,需警惕this、隐式返回及异步问题。

JavaScript 函数式编程不是一套独立语法,而是用语言现有能力(如高阶函数、闭包、不可变数据思维)去组织代码的一种风格。它不强制你写成某种形式,但一旦你开始避免修改变量、用 map 替代 for 循环、把逻辑拆成纯函数,你就已经在实践了。
纯函数怎么写,为什么 return 前不能改参数
纯函数指:相同输入永远返回相同输出,且不产生副作用(比如不修改传入的数组、不调用 console.log、不发请求)。常见错误是以为“没写 return 就是纯的”,其实改了入参就破功了:
const badAddOne = arr => {
arr.push(1); // ❌ 修改了原数组 → 不纯
return arr;
};
const goodAddOne = arr => [...arr, 1]; // ✅ 返回新数组,原数组不变
-
push、sort、splice等会改原数组的方法,在函数式里基本要换成concat、[...arr].sort()、slice+concat - 对象同理:
Object.assign({}, obj, {x: 1})或{...obj, x: 1},别用obj.x = 1 - 纯函数利于测试和缓存(比如用
memoize包裹),也方便做时间旅行调试(如 Redux DevTools)
map/filter/reduce 什么时候该用哪个
这三个是函数式操作数组的主力,选错会导致逻辑绕、性能差或 bug:
立即学习“Java免费学习笔记(深入)”;
家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l
-
map:你要“把每个元素转成另一个值”,比如[1,2,3].map(x => x * 2)→[2,4,6];别用来做“筛选”或“累加” -
filter:只保留满足条件的项,返回新数组,比如users.filter(u => u.active);别在回调里写push或改状态 -
reduce:聚合计算(求和、分组、扁平化),但容易写过重;简单场景优先用map+filter组合,比如想“取所有名字再转大写”,不用reduce模拟map
注意:reduce 初始值必须显式传,否则第一个元素当初始值——空数组会报错,而 map/filter 对空数组安全返回空数组。
为什么箭头函数不是函数式编程的银弹
箭头函数常被当作“函数式标志”,但它只是语法糖,不解决纯度问题。反而容易踩坑:
- 没有自己的
this,在对象方法中用箭头函数可能让this指向意外(比如事件监听器里想访问实例属性却拿不到) - 隐式返回只对单表达式生效;多语句必须加
{}和return,否则返回undefined,比如arr.map(x => { console.log(x); x * 2 })实际返回[undefined, undefined] - 异步场景下,
async箭头函数返回的是Promise,不是值——这跟函数式强调“可组合性”冲突,需配合then或await处理,不能直接塞进map
真正难的不是写出 const add = (a, b) => a + b,而是面对一个已有 class、一堆 this.state 和 setState 的 React 组件时,如何把副作用(API 调用、DOM 更新)和纯逻辑(数据转换、校验)清晰切开。那才是函数式思维落地最卡的地方。










