很久没上网写随笔了,最近看一个 c 的教学录像,被那个老师激励了,就记起博客园,真有段时间被遗忘掉。。。
记得之前在群里面看到有一道面试题,要求写一个 function,在叫用后返回任意参数的和。要求出来结果是这样的:
sum(1,2) // 返回3
sum(1)(2) // 返回3
sum(1)(2,3) // 返回6
sum(1)(2)(3) //返回6
当时看了感觉很有趣,也不知道什么是柯里化,今天不知道为什么突然想起这个题目 ,最近刚好看到有人说柯里化的话题,就在chrome的调试模式试着 做了一下:
1 function sum(){ 2 let _arg = []; 3 _arg.push(...arguments); 4 var ret = function(){ 5 _arg.push(...arguments); 6 // arguments.callee.valueOf=()=>(_arg.reduce((a,b)=>a+b,0)); 7 return arguments.callee; 8 } 9 ret.valueOf=()=>(_arg.reduce((a,b)=>a+b,0)); 10 return ret; 11 }
这里重点就是valueOf,js原生对象基本都有toString和valueOf 方法, 除了 null和undefined,如果valueOf返回原生对象本身,这里覆盖掉返回的function的valueOf,使其返回希望得到的结果(参数的求和)。
另外还有个闭包的,在sum里面声明 _arg 返回的函数需要每次调用的时候存储到一个集合里面,作为最后求和用。简单的满足 题目要求。
希望坚持记录,一点一点积累 的过程。
名词解释(摘录百度百科):