什么是柯里化?
柯里化函数:固定函数某一些参数,得到该函数的剩余参数的新函数,如果没有参数则调用。
在函数式编程中,柯里化函数最重要的作用是把多参函数转化为单参函数
柯里化函数实现
基本思路:
1.得到传递的非函数参数,绑定this, 返回一个新的函数
2.拿到新函数传递的参数,如果参数的数量大于等于原函数的参数,则调用。否则继续调用Currying
示例:
<script src="./index.js"></script>
<script>
function a(a, b, c) {
return a + b + c
}
const curriedAdd = myPlugin.Currying(a);
console.log(curriedAdd(1)(2)(3)); // 6
</script>
实现:
this.myPlugin.Currying = function (fn) {
let args = Array.prototype.slice.call(arguments, 1)
let that = this
return function () {
let curArgs = Array.from(arguments)
let totalArgs = args.concat(curArgs)
if (totalArgs.length >= fn.length) {
return fn.apply(null, totalArgs)
}
else {
totalArgs.unshift(fn)
return that.Currying.apply(that, totalArgs)
}
}
}
思考这个该怎么实现?
<script src="./index.js"></script>
<script>
function a(a, b, c) {
return a + b + c
}
const curriedAdd = myPlugin.Currying(a);
console.log(curriedAdd(1)(2)(3)()); // 6
console.log(curriedAdd(1, 2)(3)()) // 6
</script>
其实只需要改一行代码即可:当我们传递过来是空参时直接返回结果
if (totalArgs.length >= fn.length) {
return fn.apply(null, totalArgs)
}
替换成:
if (arguments.length === 0) {
return fn.apply(null, totalArgs)
}
注意:不要这么写企图去兼容两种方式,因为当达到最大传递参数是已经返回结果,在去传递空参会报错。
console.log(curriedAdd(1, 2)(3)()) // 6
console.log(curriedAdd(1, 2)(3)); // 6
if (arguments.length === 0 || totalArgs.length >= fn.length) {
return fn.apply(null, totalArgs)
}
评论前必须登录!
注册