xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

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 的应用场景:

  1. 参数预设:可以创建一个带有预设参数的函数,使其更加灵活和可重用。
  2. 延迟执行:可以创建一个返回函数的函数,以延迟执行某些操作。
  3. 函数组合:可以将多个 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 发布文章使用:只允许注册用户才可以访问!


posted @ 2020-11-23 18:40  xgqfrms  阅读(120)  评论(2编辑  收藏  举报