带着问题去思考,等看到答案的时候,一脸楞逼,怀疑人生。
请实现一个 add 函数,满足一下功能
add(1); // 1
add(1)(2); // 3
add(1)(2)(3);// 6
add(1)(2, 3); // 6
add(1, 2)(3); // 6
add(1, 2, 3); // 6
咋一看,这不就是柯里化么,延迟计算,很明显,带上狗脑子,拿起笔就上,然后。
然后我发现,柯里化要实现这个,不应该是这样 add(1)(2)(3)() 调用的吗?冥思苦想。
后来发现了,函数调用的时候,会默认调用 toString 和 valueOf 方法,所以是可以解决 add(1)(2)(3) 问题的,于是,兴冲冲拿起笔继续上。
function add(){
let args = [...arguments];
let _add = function(){
args.push(...arguments);
return _add;
}
_add.toString = function(){
return args.reduce((acc, cur) => acc + cur);
}
return addfun;
}
好,是时候调试了。
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
???
在 Node 环境下运行 js ,一脸楞逼。
然后在浏览器的环境下
f 1
f 3
f 6
f 6
f 6
f 6
好像没毛病。。。
console.log 的结果是有点怪异哦,也不知道这个问题是不是算是已经被解决了。
好了,珍惜我的头发,留待有缘人,不吝指教。