JavaScript进阶系列-偏函数、柯里化

偏函数

概念:柯理化固定了你函数的某一个或几个参数,返回一个新的函数,接收剩下的参数, 参数个数多是 1 个,也多是 2个,甚至更多,调用方式由 f(a, b) 转换为 f(b) 方式调用, a 已经做为参数包装到偏函数当中。bash

偏函数的实现和 bind 实现方式相似。闭包

function mul(a, b){
    return a * b;
}

// 实现一个双倍的函数
// 绑定上下文 this 为 undefined
let double = mul.bind(undefined, 2);

double(3) // 6
复制代码

这里利用了闭包的原理,double 函数其实是函数

function double(...args){
    var a = 2;
    return mul(a, ...args)
}
复制代码

这样作的好处是能够将一些参数给包装到函数中,后面只须要调用其余参数,不用重复传入包装的参数,包装的参数能够有多个。ui

// func 目标函数
// argsBound 要包装的参数,能够有多个
function partial(func, ...argsBound) {
  return function(...args) { // (*)
    return func.call(this, ...argsBound, ...args);
  }
}

function mul(a, b){
    return a * b;
}

let partialMul = partial(mul, 5)
partialMul(2) // 10
复制代码

loadsh 库也提供了 _.partial 的实现。this

函数的柯里化

概念:柯理化是把一个有 n 个参数的函数变成 n 个只有 1 个参数的函数,调用方式由 f(a, b, c) 转换为 f(a)(b)(c) 方式调用。spa

function sum(a, b){
    return a + b;
}

// 柯里化函数
function curry(func){
    return function(a){
        return function(b){
            return func(a,b)
        }
    }
}

// 返回的是一个函数
let currySum = curry(sum);
currySum(1)(2) // 3
复制代码

仅针对函数参数长度固定 柯里化须要函数有已知的参数数量是固定的。code

但在JavaScript中的函数大多数实现是超越定义的,也能够让函数使用多个参数变量执行。例如 console.log() ,后面能够研究一下这个是怎么实现的。ip

柯里化的高级实现,如 lodash 中的 _.curry 能够实现更复杂的功能。io

总结:console

  • 当咱们不想一次次重复传递参数时能够使用偏函数。
相关文章
相关标签/搜索