函数柯里化

一、定义
把一个接受多个参数的函数变为接受一个参数的函数,同时返回剩余参数且返回结果的新函数
二、应用
提取公共柯里化函数,接受至少两个参数,一个是处理函数,其余参数是处理函数所需的参数,以下代码为校验的方法

import { singleton } from "./singleton";

class Common {
    currie() {
        const fn = arguments[0];
        const args = Array.prototype.slice.call(arguments, 1);
        if (args.length === fn.length) {
            return fn.apply(null, args);
        }
        const _currie = function () {
            args.push(...arguments);
            if (args.length === fn.length) {
                return fn.apply(null, args);
            }
            return _currie;
        }
        return _currie;
    }
    verify(reg, txt) {
        return reg.test(txt);
    }
    isPhoneNumber(tel) {
        const reg = /^0?1[3|4|5|6|7|8][0-9]\d{8}$/;
        return this.currie(this.verify, reg)(tel);
    }
}

export default singleton(Common);

三、性能
a. 因要修改this指向等,使用apply,比直接调用fn稍慢些
b. 需要使用到闭包,内存开销相对较大,最好在执行完毕手动释放内存
c. 读取arguments往往比直接读取命名参数要稍微慢,尤其老版本浏览器则很明显
�四、面试真题
实现以下这么sum函数,满足一下需求

sum(1, 2) == 3
sum(1)(2) == 3
sum(1)(2, 3) == 6
sum(1)(2)(3)(4) == 10

分析如下:

  1. 参数数量不一,考虑使用闭包存储每次的参数
  2. 支持链式调用,需返回function
  3. 最终输出结果,可以考虑拦截Function的toString或者valueOf
    代码如下:
function sum() {
    const _args = Array.prototype.slice.call(arguments);
    const _sum = function() {
        _args.push(...arguments);
        return _sum;
    }
    _sum.toString = function() {
        return _args.reduce((a, b) => {
            return a + b;
        })
    }
    // _sum.valueOf = function() {
    //     return _args.reduce((a, b) => {
    //         return a + b;
    //     })
    // }
    return _sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值