这是我参与8月更文挑战的第5天,活动详情查看: 8月更文挑战
实现函数柯里化:柯里化指的是把接收多个参数的函数转变为一个单一参数的函数。并且返回接收余下的参数且返回结果的新函数的技术。
针对题目的实现
function add(a) {
return function(b) {
return function(c){
return a+b+c
}
}
}
console.log(add(1)(2)(3))
虽然达到了我们的要求但是没有什么扩展性,只能解决这个问题。所以我们引申到直接解决柯里化问题上。
柯里化解决方案
当参数是固定的时:
首先我看到这个解法很茫然,但是仔细看来一下发现还是很妙的,他利用我们柯里化返回参数调用的特性,可以计算出前面的参数和,并且在处理函数时 返回的是我们处理函数而不是处理函数的执行,那么我们在最后肯定返回的是函数体,而不是函数的结果,所以我们就要使用toString这种在类型转换时自调用的函数来返回我们的目标值了。
看一下具体的流程:执行add(2)(3)(4)
- 先执行add(3),返回一个temp(n)这个函数
- 再来temp(4),我们这时函数执行add(3)(4),返回temp函数,此时m=7,
- 再来temp(5),我们这时函数执行add(7)(5),返回temp函数,此时m=12,
- 这时我们后面再去可以执行的函数,所以返回temp时会去执行toString函数,所以我们在toString里返回m即可。
var add = function (m) {
var temp = function (n) {
return add(m + n)
}
temp.toString = function () {
return m
}
return temp
}
console.log(add(3)(4)(5)); // 12
那如果参数不固定时呢?
其实原理是一样的,就是多一步我去计算参数列表和的操作。
var add = function () {
let arg = [...arguments].reduce((prev, next) => {
return prev + next
})
var temp = function () {
let newarg = [...arguments].reduce((prev, next) => {
return prev + next
})
return add(arg + newarg)
}
temp.toString = function () {
return arg
}
return temp
}