Js函式柯里化

HuangBingQuan發表於2024-08-06

// 該函式就是接受不了多個引數
// 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())




相關文章