# 函数的柯理化

是高阶函数的一个变种。比如小明上班一天100块钱,老板每天都给他算工资。但是每天都算一遍很麻烦,所以老板决定小明上一天记一天的钱。月底算总账

如果用普通的做法可能是这样的

let day = [80,80,80,80,]
let count = 0
for (const d of day) {
    count += d
}
console.log('月薪:', count); // 320

但用柯里化函数来实现是这样的

const currying = function(fn) {
    var args = [];
    return function() {
        if (arguments.length === 0) {
            return fn.apply(this, args);
        } else {
            [].push.apply(args, arguments);
            return arguments.callee;
        }
    }
}

var count = function() {
    let money = 0;
    for (const d of arguments) {
        money += d;
    }
    return money;
} 

count = currying(count);

count(80)
count(80)
count(80)
count(80)
count() // 320

显然第二种方法几乎不需要定义过多的变量。变量少意味着程序出错的概率会大大降低。柯里化还会实现一些更有意思的事情

比如参数复用,我们可以通过这种方式定义出一些常用的函数。少接受一个参数,增加代码健壮性

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
上次更新: 8/5/2020, 12:21:17 AM