函数还能这样玩儿~实现相似add(1)(2)(3)的函数

人生的第一份前端工做找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔。前端

​ 分享一个准备面试时遇到的一个有趣的问题:程序员

要求实现相似add(1)(2)(3)调用方式的方法,例如add为加法函数,则调用add(1)(2)输出3,调用add(1)(5)(3)输出9。面试

​ 函数的调用方式是屡次调用同一个函数,将每次传入的参数累加,屡次函数运算过程当中须要记录以前累加的值。很容易让咱们联想到闭包,若是调用次数是固定的,咱们能够这样来完成:浏览器

var add = function(a) {
  return function(b) {
    return function(c) {
            return a + b + c;
        };
    };
};

add(1)(2)(3);   //6

​ 能够看到运用闭包能够依次获取三次调用的参数,最终返回相加的结果。但若是要调用四次,这个函数就不适用了。如题目要求的不限次数调用,咱们是否是可让闭包函数返回自身来实现呢?以下:闭包

var add = function(a) {
  var sum = a ;
  var addMore = function(b) {
    sum += b;
    return addMore;   //addMore函数每次累加后返回自身,继续累加后面的执行参数。
  };
  return addMore;     //获取第一个参数赋值给sum后,返回addMore函数。
}

​ 理论上这样就解决问题了,但在调试中咱们会发现,当函数调用完毕后,输出的结果并非sum,而是addMore函数,由于咱们每次调用后都return函数自身。那如今须要解决的问题就是如何让函数输出sum值。函数

​ 在网上搜索答案后发现解决方法是:调试

首先要知道JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,因此咱们重写tmp的toString和valueOf方法,返回sum的值;code

addMore.toString = function() {
  return sum;
};

​ 如上解决方法是改写addMore闭包函数的toString方法,返回sum值。所有代码以下:ip

var add = function(a) {
    var sum = a;
    var addMore = function(b) {
        sum += b;
        return addMore;
    };

    addMore.toString = function() {
        return sum;
    };

    return addMore;
};

add(1)(2)(3)(4);      //function 10
var a = add(1)(2)(3)(4).toString();  //10

​ 如上代码的倒数第二行,函数最终返回的值会包含一个function前缀(暂时没有找到缘由,是浏览器给出的提示么?请各位大神指导*0 *);结果再运用toString()函数就能够返回正确的数值。io

相关文章
相关标签/搜索