成品

let factory = (callback, paramlen, bind, thisarg) => (...param) => {
    if (param.length >= paramlen) {
        return bind ? callback.apply(thisarg, param) : callback(...param);
    }
    function cc(su, paaram){
        if (typeof su != 'object') su = [];
        let ppp = su.concat(paaram);
        if (ppp.length >= paramlen) {
            return bind ? callback.apply(thisarg, ppp) : callback(...ppp);
        }
        else return (...paaraam) => cc(Array.from(ppp), paaraam);
    }
    return (...paraam) => cc(Array.from(param), paraam);
}

对于任意一个函数 cb(p1, p2, ..., pk),调用 factory(cb, k) 得到函数 cbf,则 cb(p1, p2, ..., pk), cbf(p1)()(p2, ...,)(pk), cbf(p1, p2, ...)()(pk) 均是等价的。

实现原理

利用了 js 里变量的作用域及递归函数轻松解决。