脑洞大开:使用 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
脑子冒出奇怪的想法 我应该立即尝试 它是否可行