curry函数(柯里化)
1.curry函数
curry化是一切的基础,curry化是为了解决函数式编程时遇到的状态转换时需要的单参数需求。不过现在很多时候也用于延时执行,和插件编写。
柯里化实际上是这样的一个转换过程:把接受多个参数的函数变换成接受一个单一参数(译注:最初函数的第一个参数)的函数,如果其他的参数是必要的,返回接受余下的参数且返回结果的新函数。
2.使用场景
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>curry函数使用场景</title>
</head>
<body>
<script>
//curry函数
function curry(fn){
//固定参数
let fixed_args = Array.prototype.slice.call(arguments,1);
return function(){
let args = Array.prototype.slice.call(arguments)||[];
args = fixed_args.concat(args);
return fn.apply(this,args);
}
}
/***********************************************************************************
*curry函数使用场景
*使用场景1:url组合,很多时候我们需要拼接protocal domain 和 path,
*大多数时候protocal和domain是不变的,但是如果
*使用字符串拼接会出现很多的废代码,写死会出现无法修改的情况,这个时候curry函数就有用武之地了,
*所以curry在这个场景下的意义是灵活性
*************************************************************************************/
let $baiduCurry = curry(function(protocal,domain,path){
return `${protocal}://${domain}${path}`;
},"https","www.baidu.com");
console.log( $baiduCurry("/images") );
console.log( $baiduCurry("/books") );
/*******************************************************
*使用场景2:将柯里化后的callback参数传递给map, filter等函数。
*虽然看起来有点多余,但是这里person_curry的方法是可以反复使用
*的,如果下次你想写一个所有age字段的集合函数,就节省下来了大堆
*的代码,所以curry在这个场景下的意义是代码复用性
********************************************************/
let persons = [{name:"hcj1",age:18},{name:"hcj2",age:19},{name:"hcj3",age:20}];
let person_curry = curry(function(key){
return function(obj){
return obj[key];
}
});
let names = persons.map(person_curry("name"));
console.log(names);
</script>
</body>
</html>