详解JS函数柯里化

参考:详解JS函数柯里化

维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

Currying有哪些好处

1. 参数复用
// 正常正则验证字符串 reg.test(txt)

// 函数封装后
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

2.延迟运行

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

一道经典面试题

// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) == 6;
add(1, 2, 3)(4) == 10;
add(1)(2)(3)(4)(5) == 15;
function add2() {
    let args = Array.prototype.slice.call(arguments);
    console.log('---0---',arguments)
    function sum() {
        console.log('---1---',arguments)
        args.push(...arguments);
        return sum;
    }
    sum.toString = function () {
        console.log('---2---',args)
        let res = 0;
        let n = args.length;
        for(let i=0;i<n;i++){
            res +=args[i];
        }
        return res;
    }
    return sum;
}

console.log( add2(1)(2)(3)     +''  )         // 6
console.log( add2(1, 2, 3)(4)  +''   )         // 10
console.log( add2(1)(2)(3)(4)(5)+''  )         // 15
console.log( add2(2, 6)(1)      +''  )         // 9
posted @ 2020-11-12 16:33  尖子  阅读(251)  评论(0编辑  收藏  举报