柯里化时一种将使用多个参数的一个函数转化成一系列使用一个参数的函数的技术
优点就是降低代码的复用性,提高适应性
实现柯里化
// 实现柯里化function add(a,b,c,d){return a+b+c+d;}// 当参数满足时,才会有值,不然其余参数为unfinishedfunction 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"));
