看以下题目:
var f = (function() {
let r = 1;
return function(...args){
r *= args.reduce((p, n) => p + n);
f.valueOf = () => r; // 主要是这句代码,完全懵B
return f;
}
}());
+f(1,2,3)(2,3)(3,4,5)(6,7)
// 输出值为(1+2+3)*(2+3)*(3+4+5)*(6+7)的计算结果
考虑到用到的知识点
- reduce
- valueOf
- 递归
- ...(涉及的没提到的)
1
reduce
配合args
解构用来求每一个圆括号里面的和2 每次圆括号执行
f
都会再返回这个f
,保证了这个f
后面可以跟上无限多个圆括号3 立即执行函数保证了每有一个圆括号都立即、顺序执行
4 如果你只想得到返回的
f
函数,或者是只想让这个r
存在于各个层级f
的上下文中的话,valueOf
都没有出现的意义,但是如果你想从f()()()
中把r
取出来,就需要valueOf
了。最后的加号会用到他,这里就返回当前上下文中的r
。