柯里化时一种将使用多个参数的一个函数转化成一系列使用一个参数的函数的技术
优点就是降低代码的复用性,提高适应性
实现柯里化
// 实现柯里化
function add(a,b,c,d){
return a+b+c+d;
}
// 当参数满足时,才会有值,不然其余参数为unfinished
function FixedParmasCurry (fn){
var _arg = [].slice.call(arguments,1);
return function(){
var newArg = _arg.concat([].slice.call(arguments,0));
return fn.apply(this,newArg);
}
}
function Curry(fn,length){
var length = length || fn.length;
return function(){
if(arguments.length < length){
var combinded =[fn].concat([].slice.call(arguments,0));
return Curry(FixedParmasCurry.apply(this,combinded),length - arguments.length);
}else{
return fn.apply(this,arguments);
}
}
}
var ad = Curry(add);
var a = ad(1)(2)(3)(4); // 当参数为指定长度才会执行
//承接上面柯里化的实现
function ajkx(method,url,data){
console.log(method,url,data);
}
var ajkxCurry = Curry(ajkx);
var PostAjax = ajksCurry("post");
PostAjax=('www.baidu1.com','name=cst&code=1');
// 再次简化
// PostAjax=('www.baidu.com','name=cst&code=1');
var PostTextAjax = PostAjax('www.baidu.com');
PostTextAjax("name=cst&code=12")
袁老师柯里化的实现,代码较少
在函数式编程中,科里化最重要的作用是把多参函数变为单参函数
/**
* 科里化函数
* 在函数式编程中,科里化最重要的作用是把多参函数变为单参函数
*/
this.myPlugin.curry = function (func) {
//得到从下标1开始的参数
var args = Array.prototype.slice.call(arguments, 1);
var that = this;
return function () {
var curArgs = Array.from(arguments); //当前调用的参数
var totalArgs = args.concat(curArgs);
if (totalArgs.length >= func.length) {
//参数数量够了
return func.apply(null, totalArgs);
}
else {
//参数数量仍然不够
totalArgs.unshift(func);
return that.curry.apply(that, totalArgs);
}
}
}
科里化.htmlhelpers.js
函数管道
函数管道:将多个单参函数组合起来,形成一个新的函数,这些函数中,前一个函数的输出,是后一个函数的输入
// 函数管道:将多个单参函数组合起来,形成一个新的函数,这些函数中,前一个函数的输出,是后一个函数的输入
this.myPlugin.pipe = function(){
var args = Array.from(arguments);
return function(val){
// 函数管道精简版
return args.reduce(function(prev,icur){
return icur(prev)
},val)
// 函数管道
for(var i = 0 ; i < args.length ; i++){
var fun = args[i]
val = fun(val);
}
return val;
}
}
例子:
this.myPlugin = {}
// 将字符串修改为小驼峰格式
//将字符串中每一个单词首字母大写
function everyFirstLetterUp(str){
return str.replace(/\b(\w)(\w*)\b/g,function($,$1,$2){
return $1.toUpperCase() + $2
})
}
//将字符串中除首字母外的其他字母小写
function otherLetterLower(str){
return str.replace(/\b(\w)(\w*)\b/g,function($,$1,$2){
return $1 + $2.toLowerCase()
})
}
//去掉字符串中所有的空白字符
function removeEmpty(str){
return str.replace(/\s+/g,"")
}
//将字符串中第一个单词字符小写
function firstLetterLower(str){
return str.replace(/\w/,function($){
return $.toLowerCase()
})
}
// 函数管道:将多个单参函数组合起来,形成一个新的函数,这些函数中,前一个函数的输出,是后一个函数的输入
this.myPlugin.pipe = function(){
var args = Array.from(arguments);
return function(val){
// 函数管道精简版
return args.reduce(function(prev,icur){
return icur(prev)
},val)
// 函数管道
for(var i = 0 ; i < args.length ; i++){
var fun = args[i]
val = fun(val);
}
return val;
}
}
var smallCamel = myPlugin.pipe(everyFirstLetterUp, firstLetterLower,
otherLetterLower, removeEmpty);
console.log(smallCamel(" MY fIrST naME"));