array curry


title: 2019-06-09-array-curry
date: 2019-06-09 17:47:33
tags: curry call arguments
categories: "2019-06"

array curry

将一个方法进行curry(颗粒化), 即比如一个方法接受三个参数, 那么现在通过调用三次的方式进行实现

例如

function test(a, b, c) {
    return a+b+c;
}

//正常调用
test(1,2,3); //6

testCurry(1)(2)(3);//6

有一个方法, 比如 curry, 进行以下执行

主要实现思路是将参数一次一次通过闭包进行记录, 然后通过比较最终调用原处的方法

const testCurry = curry(test);

function curry(fn, ...arg) {
    const len = fn.length;
    if (arg.length >= len) {
        return fn.call(null, ...arg);
    }
    return function(...arg2) {
        return curry(fn, ...arg2, ...arg);
    }
}

function curryWithArgument(fn) {
    const len = fn.length;
    const arg = Array.prototype.slice.call(arguments, 1);
    if (arg.length >= len) {
        return fn.call(null, ...arg);
    }
    return function() {
        const arg2 = arguments;
        return curry(fn, ...arg2, ...arg);
    }
}

原文地址:https://www.cnblogs.com/asdfq/p/12454222.html