函数柯里化

观点

是把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,而且返回接收余下的参数而且返回效果的新函数的手艺。 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
    原文地址: https://segmentfault.com/a/1190000019427800
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞