听到同学说面试一道题目
add(1)(2)(3)(4);//10
查询了下资料 这是一个js里面的柯里化 现象
add_curry防范返回的是一个 retVal,并不是执行结果。这里的代码很想递归,但是不是这样。
每调用一次retVal 都会将参数传给他, 而之前的seed会一直保留(add_curry 营造了一个闭包,seed得以一直保存)。
1 function add_curry( seed ) { 2 3 console.log("a"+seed); 4 function retVal( later ) { 5 console.log("b"+seed); 6 console.log("b"+later); 7 return add_curry( seed + later ); 8 } 9 retVal.toString = function() { 10 return seed; 11 } 12 return retVal; 13 14 } 15 16 console.log(add_curry(1)(2)(3)(4)); 17 //我们看console.log打印结果 18 a1 19 b1 20 b2 21 a3 22 b3 23 b3 24 a6 25 b6 26 b4 27 a10 28 10
add_curry(1)(2)(3)(4) 的调用过程是:add_curry(1) -> ret(2) ->add_curry(3) -> ret(3) ->add_curry(6) -> ret(4) ->add_curry(10);