知识储备:js闭包,递归函数,es6结构解析,js高阶函数,拓展运算符等。
题目:实现一个无限累加的js函数
sum(1, 2, 3).valueOf() //6
sum(2, 3)(2).valueOf() //7
sum(1)(2)(3)(4).valueOf() //10
sum(2)(4, 1)(2).valueOf() //9
分析:js里的闭包常见的是用函数作为返回值,那么,就会出现func()()这种形式的函数,也叫立即执行函数。故联想到本题应该利用闭包来实现上述函数。
重点:利用返回值是一个函数来接收下一个括号里的参数值,至于有多少层,我们不用关心。
step1:我们应当写出一下形式的函数了,其中a是当前括号接收的参数,b是后面的括号的参数。
function sum(...a) {
const func = function(...b){
}
return func;
}
step2:至于a和b要做啥操作,做累加,故:
function sum(...a) {
let result = 0;
const func = function(...b){
// result = ...a + ...b;
}
func.toResult = function(){
return result;
}
return func;
}
这里我们用一个方法输出当前累加的值。
step4:图中注释部分扩展开来实现。
function sum(...a) {
let resultA;
resultA = a.reduce((x,y)=>{//a和b属于同一个函数的参数,自行累加
return x+y;
})
const s = function(...b){
let resultB = b.reduce((x,y)=>{
return x+y;
})
resultA=resultA+resultB;
return s;
}
s.valueOf = function () {//这里改成了题目中的valueOf
return resultA;
}
return s;
}
即可实现上述函数,但是这就限定了我们只能做累加操作,不能实现其他自定义操作。有没有一种办法只合并参数,操作单独自定义呢?有。
function sum(...a) {
const s = (...b)=>sum(...[...a,...b]);//参数合并
let result = a.reduce((x,y)=>{//当前阶段求值
return x+y;
})
s.valueOf = function () {//函数出口
return result;
}
return s;
}
结果:
闭包很有意思哈,哈哈哈。