什么是javascript函数式编程【教程】

9次阅读

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

什么是javascript函数式编程【教程】

javascript 函数式编程不是一套独立语法,而是用语言现有能力(如高阶函数、闭包、不可变数据思维)去组织代码的一种风格。它不强制你写成某种形式,但一旦你开始避免修改变量、用 map 替代 for 循环、把逻辑拆成纯函数,你就已经在实践了。

纯函数怎么写,为什么 return 前不能改参数

纯函数指:相同输入永远返回相同输出,且不产生副作用(比如不修改传入的数组、不调用 console.log、不发请求)。常见错误是以为“没写 return 就是纯的”,其实改了入参就破功了:

const badAddOne = arr => {   arr.push(1); // ❌ 修改了原数组 → 不纯   return arr; }; 

const goodAddOne = arr => [...arr, 1]; // ✅ 返回新数组,原数组不变

  • pushsortsplice 等会改原数组的方法,在函数式里基本要换成 concat[...arr].sort()slice + concat
  • 对象同理:Object.assign({}, obj, {x: 1}){...obj, x: 1},别用 obj.x = 1
  • 纯函数利于测试和缓存(比如用 memoize 包裹),也方便做时间旅行调试(如 Redux DevTools)

map/filter/reduce 什么时候该用哪个

这三个是函数式操作数组的主力,选错会导致逻辑绕、性能差或 bug

立即学习Java免费学习笔记(深入)”;

  • 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,不是值——这跟函数式强调“可组合性”冲突,需配合 thenawait 处理,不能直接塞进 map

真正难的不是写出 const add = (a, b) => a + b,而是面对一个已有 class、一 this.statesetStatereact 组件时,如何把副作用(API 调用、dom 更新)和纯逻辑(数据转换、校验)清晰切开。那才是函数式思维落地最卡的地方。

text=ZqhQzanResources