脑洞大开:使用 js 的生成器实现 柯里化函数

238 阅读1分钟

脑洞大开:使用 js 的生成器实现 柯里化函数

在看见了冴羽哥的柯里化函数函数自后,脑袋突然闪现出能不能用生成器去实现它,哟不错的想法。

生成器的使用我就不和大家介绍了,柯里化函数的使用相信大家也会。

直接上代码

    function curry(fn, ...arg) {
        //创建一个生成器
        function* currie(fn, ...arg) {
            while (true) {
                //第一次调用 next 方法 如果参数足够就直接执行函数
                if (arg.length >= fn.length) {
                    return fn(...arg)
                }

                //把每次调用 next 函数传递的参数给保存下来
                arg.push(yield)
            }
        }
        //创建迭代器
        const generator = currie(fn, ...arg);

        //在立即执行一次迭代    
        const mb = generator.next()

        //如果 done === true 证明参数足够
        if (mb.done) {
            return mb.value
        }

        //当函数的参数不够时,需返回一个函数 
        return function b(...r) {
            //使用 循环审是因为 yield 只能接受一个参数  所以需要虚幻来 不断调用 next
            for (let i = 0; i < r.length; i++) {
                const result = generator.next(r[i])
                //迭代完成 证明函数已经执行 返回迭代的结果
                if (result.done) return result.value
            }
            // 经过循环之后 迭代没有完成 就返回 函数的本身
            // 通过闭包可以继续对 generator 迭代器进行迭代
            return b
        }
    }

测试


    function sum(a, b, c, d) {
        return a + b + c + d
    }
    const a = curry(sum, 1);
    //测试不传递参数
    const b = curry(a);
    //测试传递多个参数
    const c = curry(b, 2, 3)
    //正常输出
    console.log(c(4)) // 10

脑子冒出奇怪的想法 我应该立即尝试 它是否可行