函数柯里化遇到了generator

215 阅读1分钟

起因

最近在看掘金的面试经的时候,函数柯里化的出镜率相当高,大家对于这类面试题也有了相关的标准答案,今天我交一份不一样的答案给大家。

思考过程

首先函数的柯里化带来的结果是,使得原本要接收n个参数的函数可以分步接收参数,在参数个数满足条件后再执行,想到这个流程,我就想到了ES6里面的generator函数,因为这两者的流程很相似,generator函数不是立即执行,而是通过next按步执行,而且next可以传值,这样就肯定可以用generator函数改写相关函数为“柯里化函数”了。

答卷

    function gKeli(fn) {
        let len = fn.length
        let args = []
        let result
        function *gg() {
            for (let i = 0; i < len; i++) {
                let t = yield
                args.push(t)
            }
            result = fn.apply(null, args)
        }
        let tt = gg()
        tt.next()
        return function ah(t) {
            tt.next(t)
            if(result) {
                return zz
            }
            return ah
        }
    }
    
    function add(a, b, c) {
        return a + b + c
    }
    
    console.log(gKeli(add)(1)(2)(3)) // 输出6