nodejs-shizhan icon indicating copy to clipboard operation
nodejs-shizhan copied to clipboard

79页函数柯里化实现有问题

Open Kerminate opened this issue 6 years ago • 1 comments

image 我的修改如下

function curry(fn, args = []) {
  const length = fn.length
  return function() {
    const _args = args.slice(0)
    Array.prototype.push.apply(_args, Array.prototype.slice.call(arguments))
    if (_args.length === length) {
      return fn.apply(this, _args)
    }
    return curry.call(this, fn, _args)
  }
}

Kerminate avatar Oct 03 '18 02:10 Kerminate

恩,忘记当初是怎么测试的了。最主要还是 arg 引用被复用了 没有重置,而且返回值也不是函数。

修改成如下可以正常使用,你的解决方案也行,不过没那么容易理解,对读者要求有些高。

function curry(fn) {
	const length = fn.length
	let _args = []
	const invoke = (...args) => {
		_args = _args.concat(args);
		if (_args.length == length) {
			const val = fn(..._args)
			_args = []
			return val
		}
		return invoke
	}
	return invoke
}

const arrfn = curry((a,b,c) => [a,b,c])

console.log(arrfn(1,2,3))
let arr = arrfn(1)(2)(3)
console.log(arr)

MiYogurt avatar Oct 03 '18 03:10 MiYogurt