JS函数柯里化

什么是函数柯里化(Currying)?

官方定义:把一个接收多个参数的函数,设计成一个:接收单一参数的函数,并返回一个能够接收剩余参数的新函数,最后返回结果。

1、简单场景:求两数之和

普通函数
    function addNum(a,b) {
        return a + b;
    }
    console.log("普通函数"+addNum(1,2)); //3
柯里化函数
   function addNumCurry(a) {
        return function (b) {
          return a+b //能获取到a的值,是闭包的特性
        }
    }
    console.log("柯里化函数", addNumCurry(1)(2));//3
addNumCurry(1)(2), 有没有感觉用法跟自执行函数类似?
  (function ziZhiXing(a){
        console.log("自执行函数",a) //自执行函数 10
    })("10");

2、复杂场景:求 1-5 之和

  function addNumCurry(a) {
        return function (b) {
          return function (c) {
              return function (d) {
                  return function (e) {
                      return a+b+c+d+e
                  }
              }
          }
        }
    }
    console.log("柯里化函数", addNumCurry(1)(2)(3)(4)(5));//15
简化写法
function addNumCurry(a) {
        let numAll = a || 0; //存放数字和
        let fn =  function (b) {
            numAll = numAll + b
            return fn
        }
        //累加到最后一个后,自定义个结束属性,也可以用原来就有的属性
        fn.MyOver = function () {
            return numAll
        }
        return fn
    }
    console.log("柯里化函数",addNumCurry(1)(2)(3)(4)(5).MyOver());//15

3、进阶场景:求 1-10 之和,每个里面参数不确定。例如 addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10)

function addNumCurry(a) {
        let numAll = []; //存放数字和
        let _args = Array.prototype.slice.call(arguments); //存放第一次进去的参数
        numAll = [..._args]
        let fn =  function (b) {
            let _brgs = Array.prototype.slice.call(arguments);
            numAll = [...numAll,..._brgs]
            return fn
        }
        //累加到最后一个后,自定义个结束属性,也可以用原来就有的属性
        fn.MyOver = function () {
            //数组累加和 reduce
            return numAll.reduce((x,y)=>{
                return x+ y
            })
        }
        return fn
    }
    console.log("柯里化函数",addNumCurry(1,2,3)(4,5)(6)(7,8)(9,10).MyOver());//15
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在正式聊函数柯里化之前,我这里给大家补充下高阶函数的概念和应用: 1.1、什么是高阶函数?高阶函数英文叫 High...
    天問_专注于大前端技术阅读 3,809评论 0 6
  • 第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了...
    flowsands阅读 233,163评论 40 282
  • 首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受...
    指尖跳动阅读 277评论 0 1
  • 什么是柯里化? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函...
    Mica_马超阅读 257评论 0 2
  • 什么是函数柯里化? 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函...
    jeff1804阅读 385评论 0 1