fe-learning icon indicating copy to clipboard operation
fe-learning copied to clipboard

JS实现函数无限操作

Open metroluffy opened this issue 5 years ago • 2 comments

JS实现函数无限操作

题目

用Javascript实现一个无限极函数,形如:

operator (1)(2)(3) => f(x)...;
operator (1)(2)(3)() => 6;

注意:执行operator的时候如果最后不是以()结尾(如operator (1)(2)),则这个结果会一直缓存到闭包里。如果下次直接operator (3)(4)的话结果是10.因为他会累加之前的结果。如果你不想这样,那可以通过加()消费缓存的结果。

实现

闭包的一个应用。

function add(x, y) {
    if (isNaN(+x)) {
        x = 0;
    }
    if (isNaN(+y)) {
        y = 0;
    }
    return x + y;
}
var operator = (function(op) {
    let result = null;
    return function (x) {
        if (x) {
            result = op(x, result);
            return arguments.callee; // 在严格模式下无效, 你可以给定函数一个名字
        } else {
            let ret = result;
            result = null;
            return ret;
        }
    }
})(add);

metroluffy avatar Apr 17 '20 10:04 metroluffy

补充一个改良版本:

/**
 * 函数 currying
 * @param fn
 * @return {helper}
 */
const currying = (fn) => {
    let res = 0
    return function helper (...args) {
        if (!args.length) {
            return res
        }
        res += fn.apply(null, args)
        return helper
    }
}
const sum = currying((...args) => Array.from(args).reduce((prev, curr) => prev + curr))
console.log(sum(1,2,3)(7,8,9)(100)())

pigpigever avatar Jun 12 '20 12:06 pigpigever

const operator = (...args) => {
    let params = [...args];
    const _add = (...args1) => {
        console.log('args1', args1);
        params = [...params, ...args1];
        if (args1.length > 0) {
            return _add;
        } else {
            return params.reduce((a, b) => a+b, 0);
        }
    }
    return _add;
}   

sfsoul avatar Jul 09 '20 12:07 sfsoul