这是一道经典的题目,先上代码:

解法1:

function add () {
var args = Array.prototype.slice.call(arguments); var fn = function () {
var sub_arg = Array.prototype.slice.call(arguments);
   // 把全部的参数聚集到参数的入口为一个参数: args.concat(sub_arg)
return add.apply(null, args.concat(sub_arg));
} fn.valueOf = function () {
return args.reduce(function(a, b) {
return a + b;
})
} return fn;
}
console.log(add(1,2)) // 3
console.log(add(1)(2)) // 3
console.log(add(1)(2)(3)) // 6
console.log(add(1,2,3)(4)) // 10

解法2:

    function add () {
var args = Array.prototype.slice.call(arguments); var fn = function () {
     // 把参数都放在一个相当于全局变量的 args 里面 
args.push(...arguments)
return fn;
} fn.valueOf = function () {
return args.reduce(function(a, b) {
return a + b;
})
} return fn;
}
console.log(add(1,2)) // 3
console.log(add(1)(2)) // 3
console.log(add(1)(2)(3)) // 6
console.log(add(1,2,3)(4)) // 10

解题的关键技术点如下

一. 函数柯里化

柯里化定义:

    是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果是新函数的技术。

对定义的解释:

对比下平常的函数,都是返回一个结果(具体的值),而柯里化的函数是可以接收多个参数比如 "(1)(2)",并且返回的是一个新的函数(比如代码里的 fn ),而且这个新函数接收剩下的参数。

二. 自定义修改 valueOf 方法

valueOf简单来说,就是在console.log(add(1))的时候,会自动调用valueOf方法,我们把它重写了, 调用的时候,就把 args 这个数组求和返回就是最终结果了。

valueOf的具体讲解看这里 https://blog.csdn.net/dapangzi88/article/details/61197937#   讲的很好。

参考: https://www.jianshu.com/p/2975c25e4d71      https://blog.csdn.net/dapangzi88/article/details/61197937#

最新文章

  1. Web Service概念梳理
  2. iOS圆饼图和圆环的绘制,并且添加引线
  3. 【hdu 5918】Sequence I(KMP)
  4. (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
  5. nginx 解决400 bad request 的方法(转载)
  6. Redis 如何导出数据
  7. spring事务管理学习
  8. flex 4 datagrid 奇偶行颜色设置
  9. Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLIC
  10. javascript window.confirm确认 取消对话框实现代码小结
  11. ASP.NET MVC 项目直接预览PDF文件
  12. 第一册:lesson 103.
  13. [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
  14. python模块之os_sys_动态导入_包
  15. 编写高质量代码:改善Java程序的151个建议 --[117~128]
  16. 51nod1693 水群 最短路
  17. linux 学习笔记 显示压缩文件 gong.zip 的文件内容
  18. caffe中在某一层获得迭代次数的方法以及caffe编译时报错 error: 'to_string' is not a member of 'std'解决方法
  19. javascript 重构alert()
  20. 使用rsync实现客户端与服务器端的文件同步与传送,重点是原理和参数解释

热门文章

  1. eclipse中jar包打断点
  2. 【Git】windows上git命令中文乱码的问题
  3. Android服务之bindService源代码分析
  4. HIVE 不支持group by 别名
  5. Nginx反向代理、负载均衡及日志
  6. Nginx user_agent、if指令及全局变量
  7. Android 6.0及以上版本号的执行时权限介绍
  8. springboot 有用网址收集
  9. svn解决与优化帮助
  10. Odoo 8,9,10 制造领料、入库 实践