Js函数柯里化


// 该函数就是接受不了多个参数
// function add(x, y) {
//     return x + y;
// }
// console.log(add(1, 2)); // 3
// console.log(add(5, 7)); // 12


// 接下来我们要将其进行柯里化

// function add(x){
//     return function(y){
//         return x + y;
//     }
// }

// console.log(add(1)(2));

// 固定参数

// function check(reg, txt) {
//     return reg.test(txt)
// }

// // 即使是相同的正则表达式,也需要重新传递一次
// console.log(check(/\d+/g, 'test1')); // true
// console.log(check(/\d+/g, 'testtest')); // false

// function check(reg){
//     return function(str){
//         return reg.test(str);
//     }
// }

// var func = check(/\d+/g);
// console.log(func('test1'));
// console.log(func('testtest'));
// console.log(func('abc'));


// console.log(check(/[a-z]+/g)('test'));


// 封装一个通用的柯里化函数

// function curry() {
//     var fn = arguments[0]; // 拿到要执行的函数
//     var args = Array.prototype.slice.call(arguments, 1);
//     // 接下来,我们就需要判断这个参数是否足够
//     if(args.length === fn.length){
//         // 进入此 if,说明第一次参数就是传够了的
//         // 直接执行 fn 函数
//         return fn.apply(this, args);
//     }
//     // 下面是处理参数不够的情况
//     function _curry(){
//         args.push(...arguments);
//         if(args.length === fn.length){
//             return fn.apply(this, args);
//         }
//         return _curry;
//     }
//     return _curry;
// }

// // 测试 1
// function add(a, b, c) {
//     return a + b + c;
// }

// console.log(curry(add)(1)(2)(3)); // 6
// console.log(curry(add, 1)(2)(3)); // 6
// console.log(curry(add, 1, 2, 3)); // 6
// console.log(curry(add, 1)(3, 4)); // 8

// var addCurrying = curry(add)(2);
// console.log(addCurrying(7)(8)); // 17

// // 测试 2
// function check(reg, txt) {
//     return reg.test(txt)
// }
// var hasNumber = curry(check)(/\d+/g);
// console.log(hasNumber('test1'));// true


// 一道面试题

// add(1)(2)(3) = 6;
// add(1, 2, 3)(4) = 10;
// add(1)(2)(3)(4)(5) = 15;


function add(){
    // 拿到第一次调用的所有的参数
    var args = Array.prototype.slice.call(arguments);
    
    // 该函数会被返回,该函数的作用是继续收集参数
    function _adder(){
        args.push(...arguments);
        return _adder;
    }

    // 当调用 toString 方法的时候,说明我不要再接收参数了
    // 执行计算操作
    _adder.toString = function(){
        return args.reduce((a,b)=>a+b);
    }

    return _adder;
}

console.log(add(1)(2)(3).toString())
console.log(add(1, 2, 3)(4).toString())
console.log(add(1)(2)(3,4,5)(6,7).toString())




posted @ 2024-08-06 09:51  HuangBingQuan  阅读(4)  评论(0编辑  收藏  举报