人生的第一份前端工做找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔。前端
分享一个准备面试时遇到的一个有趣的问题:程序员
要求实现相似
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