函数柯里化
作者:互联网
函数柯里化
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成
接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
这个技术由 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
函数就是一个柯里化的函数,实现如下:
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;
}
为何使用toString
在对象为操作数(表达式中的参数或常量)时,解释器会默认调用对象的valueOf
函数,
当对象为Date
类型且在进行 +
运算时,以及其他所有情况中,解释器会默认调用对象的 toString
函数。
因此,对于上述的add
函数,当我们进行类似于 add(1)(2)(3)
这样的调用时,由于返回的是一个函数,当我们试图单独调用时,解释器就会对其调用toString
来对其转换。
当其在表达式中时,例如 add(1)(2)(3) + 5
时,解释器会先调用_adder
的valueOf
函数,没有此函数时则会调用toString
函数。
参考文章
https://blog.csdn.net/shaofei63/article/details/42743245
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
https://www.jianshu.com/p/2975c25e4d71
标签:函数,args,add,toString,adder,柯里化,参数 来源: https://www.cnblogs.com/zmj97/p/10948795.html