实现一个函数如下效果:
add(1) //1
add(1)(2) //3
add(1)(2)(3) //6
首先我们一个个来实现以下:
//add(1)
function add(a){
return a;
}
//add(1)(2)
function add(a){
return function(b){
a = a + b;
return a;
}
}
//add(1)(2)(3)
function add(a){
return function(b){
a = a + b;
return function(c){
a = a + c;
return a;
}
}
}
//.....................................
如果分开来看,我们都可以单独实现他,都很简单,那我们怎么一个函数来实现呢?
那我们来分析一下,分析下上面的三个函数实现,是否得出一些规律呢,add函数后面每增加一个“(num)”,实现中都会多一层“ return function(){} ”。
那就一起来修改下。
function add(a){
var num = function(b){
a = a + b;
return num;
}
return num;
}
看是不是和上面的执行规律一致了,每次调用都会返回一个函数来接受下次的传值,这样你会发现,每次返回的都是函数,可是我想要返回的是值,而不是无限的返回函数。
那我们就来尝试来解决一下
function add(a){
var num = function(b){
if(b){ //当后面传入有参数时,继续返回函数
a = a + b;
return num;
}else{ //当后面出入无参数时,返回值
return a;
}
}
num.toString = function(){return a}
return num;
}
这样的话,我们也算是最后可以返回求和的值了,不过还是在调用的时候有却别。
题意: add(1)(2) //3
目前解: add(1)(2)() //3
那我们就得考虑下,JS中引用类型转换为原始值的规则,重写valueOf toString来实现。
function add(a){
var num = function(b){
a = a + b;
return num;
}
num.valueOf = num.toString = function(){return a};
//当引用类型需要转为字符串时,自动调用toString方法
//当引用类型需要转为数字时,自动调用valueOf方法
return num;
}