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

  • 當咱們不想一次次重複傳遞參數時能夠使用偏函數。
相關文章
相關標籤/搜索