高阶函数之柯里化

一、什么是高阶函数?

JavaScript的函数都指向某个变量,变量可以指向函数,函数的参数又能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

二、什么是柯里化?

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。(度娘)

就个人理解,柯里化函数执行时产生一个闭包,把一些信息预先存储起来,目的是供上下文使用。这样预先存储和处理,就是函数的柯里化。

三、函数柯里化的应用

常见面试题
add(1)(2)(3) = 6;
add(1,2,3)(4)=10;
add(1)(2)(3)(4,(5))=15;

  • 先了解一个知识点:
    1. 调用函数加括号fn():执行函数体fn,执行后得到其返回值;
    2. 调用函数不加括号fn:不会执行函数体,而是得到函数体的源码。函数名起始就是指向函数的指针,它知识传递了函数体所在的地址位置,在需要执行时找到函数体去执行;
function add() {
            // let args = arguments;// 把保存变量的arguments赋值给args保存起来
            // 注意arguments是对象 进行数组转换
            let args = Array.prototype.slice.call(arguments);
            let inner = function () { // 这个内部函数起始就是接收第二次传入的参数
                args.push(...arguments)
                let sum = args.reduce((prev, cur) => {
                    return prev + cur
                })
                return sum //确定返回内容
            }
            return inner //返回内部函数实现基本的柯里化
        }
        console.log(add(1)(2));// 每次增加一个括号,都需要增加一个内部函数
  • 增加无数多个或不定数量的内部函数实现是不现实的,可以用递归来解决。这里实际是参数的复用。
        function add() {
            let args = Array.prototype.slice.call(arguments);
            let inner = function () {
                args.push(...arguments)
                return inner
            }
            return inner
        }
        console.log(add(1)(2)(3)(4)); 
//以字符串形式返回内部函数,也就是说原本的函数发生了隐式转换,而发生隐式转换是因为调用了内部的toString方法。
  • 最后实现把内部函数相加,但是因为内部函数应景返回内部函数,很难返回一个额外的结果到外部。
  • return fn,fn是一个函数类型的变量,得到的是函数体源码,而想要得到函数体的源码,就会自动调用toString()方法;如果要打印fn里的内容,只需要重写toString方法。
 function add() {
            let args = Array.prototype.slice.call(arguments);
            let inner = function () {
                args.push(...arguments)
                return inner
            }
            inner.toString = function() { //重写toString()
                return args.reduce((prev, cur) => {
                    return prev + cur
                })
            }
            return inner
        }
        console.log(add(1)(2)(3).toString()); //toString()只有函数返回值参与计算时才会自动调用

这样就“大功告成”啦!

  • 再来看看含有柯里化技术的箭头函数
const List = [
            {name:'路飞', profession: '一号机'},
            {name:'艾斯', profession: '二号机'},
            {name:'萨博', profession: '三号机'},
        ]
        const currying = name => el => el[name]
        const list_name = currying('name')
        console.log(List.map(list_name)); // ['路飞', '艾斯', '萨博']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值