封装一个count方法,能实现如此调用:count(a)(b)(c)(d)(e)… 并且返回的值为参数连乘的结果,即a*b*c*d*e*

封装一个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*

上一篇:

下一篇: