js 深入原理讲解系列 currying function All In One
js 深入原理讲解系列 currying function All In One
能看懂这一题你就掌握了 js
科里函数
(科里化
)的核心原理
不要专业的术语,说人话,讲明白!
科里化
Currying 是一种将一个
接受多个参数
的函数转换为一系列
接受单个参数
的函数的技术
。
function add(a, b) {
return a + b;
}
// Currying 版本
function addCurried(a) {
return function(b) {
return a + b;
}
}
// 使用普通函数
console.log(add(2, 3)); // 输出: 5
// 使用 Currying 函数
let add2 = addCurried(2);
console.log(add2(3)); // 输出: 5
Currying 的应用场景
:
参数预设
:可以创建一个带有预设参数的函数,使其更加灵活和可重用。延迟执行
:可以创建一个返回函数的函数,以延迟执行某些操作。函数组合
:可以将多个 Currying 函数组合在一起,创建更复杂的功能。
AI
prompt=指导我掌握 javascript currying 的基本步骤。
https://duckduckgo.com/?q=DuckDuckGo&ia=chat
Q: 实现 sum 函数使得以下表达式的值正确
const log = console.log;
const sum = ???;
sum(1, 2, 3).sumOf(); //6
sum(2, 3)(2).sumOf(); //7
sum(1)(2)(3)(4).sumOf(); //10
sum(2)(4, 1)(2).sumOf(); //9
A: 原型链
// bug ❌
function sum(...args) {
// function.length 函数长度
let len = sum.length;
// let args = arguments;
return function curry (args) {
// args.length 参数长度
if(args.length <= len) {
// 立即执行
return sum.apply(sum, ...args)
} else {
return function (...args2) {
// 合并参数
curry.apply(sum, args.concat(...args2))
}
}
// 返回 this 链式调用
this.sumOf = function() {
return this.curry();
}
}
}
// OK ✅
const sum = (...args) => {
const collectArgs = (...collectedArgs) => sum(...collectedArgs, ...args)
collectArgs.sumOf = () => args.reduce((a, b) => a + b, 0);
return collectArgs;
}
科里函数 / currying function
高阶函数
科里化
原型链
闭包
closure
demos
https://github.com/xgqfrms/FEIQA/issues/63#issuecomment-2106300095
https://github.com/xgqfrms/FEIQA/issues/63#issuecomment-2106300039
refs
https://javascript.info/currying-partials#advanced-curry-implementation
https://zh.javascript.info/currying-partials#gao-ji-ke-li-hua-shi-xian
https://www.cnblogs.com/xgqfrms/p/11342509.html#4744377
©xgqfrms 2012-2020
www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/14025942.html
未经授权禁止转载,违者必究!