概念

是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 from wiki百科

Function.prototype.curry = function() {
    let args = arguments;
    let that = this;
    return function() {
        return that.apply(null, [...args].concat(...arguments));
    }
}

function add() {
    let args = [...arguments];
    let sum = 0, i = 0;
    while(i < args.length) {
        sum += args[i];
        i++;
    }
    return sum;
}
console.log(add.curry(2, 3)(4))  // 9

以上就是 一个简单的函数柯里化的实现。

运用

为什么要封装一层呢?就要说到柯里化的运用了。js中最最经典的柯里化运用就是bind了, 用于函数的this值绑定, 同时并非让函数立即执行。

// bind实现
Function.prototype.bind = function (context) {
    var that = this
    var args = Array.prototype.slice.call(arguments, 1)
 
    return function() {
        return that.apply(context, args)
    }
}

还有一些网上的例子,日常开发中也常常会用到,如参数复用。
引用https://www.jianshu.com/p/297...

// 函数封装后
function check(reg, txt) {
    return reg.test(txt)
}

check(/\d+/g, 'test')       //false
check(/[a-z]+/g, 'test')    //true

// Currying后
function curryingCheck(reg) {
    return function(txt) {
        return reg.test(txt)
    }
}

var hasNumber = curryingCheck(/\d+/g)
var hasLetter = curryingCheck(/[a-z]+/g)

hasNumber('test1')      // true
hasNumber('testtest')   // false
hasLetter('21212')      // false

JessieMcQueen
0 声望0 粉丝

擅长写bug