云计算百科
云计算领域专业知识百科平台

柯里化【JavaScript】

什么是柯里化?

柯里化函数:固定函数某一些参数,得到该函数的剩余参数的新函数,如果没有参数则调用。

在函数式编程中,柯里化函数最重要的作用是把多参函数转化为单参函数

柯里化函数实现

基本思路:

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)
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » 柯里化【JavaScript】
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!