js柯里化
一、来源
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
二、curring(1)(2)(3)(4)() 如何实现参数相加得出结果为10呢?
1.其实我们只用思考如何把每个参数保留下来,最后在调用的时候,把参数累加起来? 这个是我们思考的重点。
function keepParams(){
var arg = [];
return function params(){
if(arguments.length === 0){
return arg;
}
Array.prototype.push.apply(arg,arguments); //对apply方法不熟悉的可以去百度下
return params;
}
}
var curring = keepParams();
console.log(curring(1)(2)(3)(4)()); // [1, 2, 3, 4] 2. 通过第一步我们可以把参数得到 那么接下来我们想干嘛,就可以干嘛了。
如何实现相加呢?
3.更改下基础函数
function add(){
var sum = 0,l = arguments.length;
for(var i = 0; i < l; i++){
sum += arguments[i];
}
return sum;
};
function keepParams(fn){
var arg = [];
return function params(){
if(arguments.length === 0){
return fn.apply(this,arg);
}
Array.prototype.push.apply(arg,arguments); //对apply方法不熟悉的可以去百度下
return params;
}
}
var curring = keepParams(add);
//console.log(curring(1)(2)(3)(4)()); // 10
console.log(curring(1)(2,3,4)()); // 10 4.既然第三步相加实现了,那么相乘啊,相除啊。等等一系列的操作都可以搞定了。不过需要注意的时候,其中使用了闭包,如果连续调用同一个方法2次。
arg会保存在内存之中
console.log(curring(1)(2)(3)(4)()); // 10 console.log(curring(1)(2,3,4)()); // 20
相关推荐
81244053 2020-09-23
Kakoola 2020-08-01
wanwanwandj 2020-02-24
ncisoft 2019-11-03
samsai00 2019-10-22
lka0 2019-09-07
RainyX 2019-06-30
81244053 2019-06-28
AlgerFan 2019-06-28
xiaozaq 2019-06-28
关东升 2019-06-20
cewei 2015-11-04
skshenghuo 2017-03-31
jsplijun 2019-05-05
你好C 2018-01-28
稀土 2017-12-12
前端开发 2017-03-22
前端开发 2016-12-13