在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成html
接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数且返回结果的新函数的技术。数组
这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。函数
add(1)(2)(3) = 6; add(1, 2, 3)(4) = 10; add(1)(2)(3)(4)(5) = 15;
这个 add
函数就是一个柯里化的函数,实现以下:.net
function add() { // 将伪数组arguments转化为数组并存储在_args中,之后接受的全部参数也都存储在_args中 let _args = [].slice.call(arguments); // _adder 函数将之后接收的参数都存储到_args中 let _adder = function () { _args.push(...arguments); // 返回自身(函数),从而能够无限接收参数 return _adder; } // 为什么使用toString见下文 // toString 返回最后取值, 即全部参数的和 _adder.toString = function () { return _args.reduce(function (sum, item) { return sum + item; }); } //返回_adder函数 return _adder; }
在对象为操做数(表达式中的参数或常量)时,解释器会默认调用对象的valueOf
函数,code
当对象为Date
类型且在进行 +
运算时,以及其余全部状况中,解释器会默认调用对象的 toString
函数。htm
所以,对于上述的add
函数,当咱们进行相似于 add(1)(2)(3)
这样的调用时,因为返回的是一个函数,当咱们试图单独调用时,解释器就会对其调用toString
来对其转换。对象
当其在表达式中时,例如 add(1)(2)(3) + 5
时,解释器会先调用_adder
的valueOf
函数,没有此函数时则会调用toString
函数。blog
参考文章ci
https://blog.csdn.net/shaofei63/article/details/42743245get
https://jingyan.baidu.com/album/3c48dd347c0474e10be358af.html?picindex=3
https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin