背景
柯里化(Currying)是前端面试和函数式编程中的高频概念,但在日常业务中经常被误用。
很多代码把“返回函数”都称为柯里化,导致抽象层级混乱,最终影响可读性与维护成本。
在工程实践中,柯里化的核心价值不在“写法炫技”,而在于:
- 固化部分参数,提升复用能力。
- 将多参数函数拆分为可组合的单参数链。
- 让业务表达更贴近“配置 + 执行”的模式。
核心原理
柯里化是什么
本质上,柯里化是把一个接收多个参数的函数,转换成一系列每次只接收部分参数的函数,直到参数满足后再执行。
柯里化(Currying)是前端面试和函数式编程中的高频概念,但在日常业务中经常被误用。
很多代码把“返回函数”都称为柯里化,导致抽象层级混乱,最终影响可读性与维护成本。
在工程实践中,柯里化的核心价值不在“写法炫技”,而在于:
本质上,柯里化是把一个接收多个参数的函数,转换成一系列每次只接收部分参数的函数,直到参数满足后再执行。
在前端开发中,“命令式”和“声明式”并不是抽象概念,而是每天都会遇到的设计选择:
需要关注的是,这不是二选一关系。现代前端工程通常是“声明式为主、命令式兜底”的混合架构。理解两者边界,有助于在可维护性、性能和开发效率之间做出更稳定的取舍。
命令式关注“怎么做”。开发者显式给出步骤、顺序和状态变更路径。
典型特征:
?? 是为“默认值表达”引入的语义化运算符。对于较旧浏览器,需要通过 Babel 转译或 polyfill 方案兼容。
空值合并运算符(nullish coalescing operator)的写法为两个问号 ??。
由于它对待 null 和 undefined 的方式类似,所以在本文中我们将使用一个特殊的术语对其进行表示。为简洁起见,当一个值既不是 null 也不是 undefined 时,我们将其称为“已定义的(defined)”。
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol
使用const定义
引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
在JavaScript中,引用类型的数据指向创建对象的内存地址
const创建的对象为 变量的绑定不可变,即为绑定的对象内存地址不可变,内部数据可以改变
function* factorial(n) {
if(n===0) return 1;
let result = 1;
for (let i = 1; i <= n; i++) {
result *= i;
yield result; // 每次产出 i! 的值
}
}
function log(key, ms) {
return setTimeout(() => {
console.log(key);
}, ms);
}
(async function () {
await log(1, 300);
await log(2, 200);
})();
(async function () {
let a = log(3, 200);
let b = log(4, 300);
await a;
await b;
})();