封装一个count方法,能实现如此调用:count(a)(b)(c)(d)(e)… 并且返回的值为参数连乘的结果,即a*b*c*d*e*
先写出正确代码:
function count(x){
var fn = function(y){
return count(x*y);
}
fn.toString = function(){
return x;
};
return fn;
}
接下来我要写我的思路了:
首先看到这么多括号,想到的是count()方法要根据要求做很多次return function,
纯手打一次代码模拟一下,即:
var count = function(x) {
return function(y) {
return function(z) {
return x * y * z;
}
}
}
console.log(count(2)(3)(4)); //24
可是观摩半天找不到count的规律,每次return虽然一致,但是最后那个x*y*z,提取不出来。
这时候就需要换思路,递归肯定得有,就是怎么将这个x*y*z整合到规律中。
那就先实现递归,先抛去x*y*z,列出递归代码:
var count = function(x) {
alert(x);
return count;
}
console.log(count(2)(3)(4));
上面的alert(x),是为了看代码是怎么执行的,弹出的值就是括号里的2、3、4
于是又可以想到要是能把这些值保存下来就好了,然后在最后一步做相乘。但是这么做就得引入其他的变量,在count方法内定义变量保存x肯定是多此一举,没办法实现,在count方法外定义变量就跟题意相悖也不可控;
所以重点就是想怎么在count方法内存储这个x*y*z。
于是可以想到这个:已经可以获取到每个括号里的值了,那我们可以把每次的乘值传参!
var count = function(x) {
return count(x*x) ;
}
console.log(count(2)(3)(4));
但这样写是报错的,因为一旦return count(),那程序就自己死循环了。我们既需要count传参又不想让他执行,只能把count()当作变量值来对待:
var count = function(x) {
var newCountFunc = function(y) {
return count(x * y);
}
}
console.log(count(2)(3)(4));
但是新问题又来了, 缺乏调用啊, 于是再改:
var count = function(x) {
var newCountFunc = function(y) {
return count(x * y);
}
return newCountFunc;
}
当然,继续出问题,newCountFunc是个方法,输出的只能是newCountFunc本身。但这个时候alert(x)还是有收获的:连续输出2、6、24,也就是说只要获取最后一个x就行,那又怎么输出x呢?我真的想破脑袋了。其实我最想干的就是弄个全局变量:
var result;
var count = function(x) {
result = x;
var newCountFunc = function(y) {
return count(x * y);
}
return newCountFunc;
}
count(2)(3)(4);
alert(result);
但是这么搞你会骂我的,真的。。。于是我想到了其实就是想找个地方存x,不用额外变量就存到函数本身:
var count = function(x) {
var newCountFunc = function(y) {
return count(x * y);
}
newCountFunc.result = x;
return newCountFunc;
}
console.log(count(2)(3)(4).result); //24
其实我觉得写到这应该就差不多了,但是非要只用:count(2)(3)(4)来实现,只能复写function内置的一些属性:比如toString,以下就都是我搜的内容了:
function count(x){
var fn = function(y){
return count(x*y);
}
fn.toString = function(){
return x;
};
return fn;
}
不过讲真,我觉得这样不好,万一以后我还想用toString原来的方法呢?被复写了就没了。。。
以上就是我的思路,不足、不对的地方请斧正!
未经允许不得转载:前端撸码笔记 » 封装一个count方法,能实现如此调用:count(a)(b)(c)(d)(e)… 并且返回的值为参数连乘的结果,即a*b*c*d*e*