一、函数柯里化的特性:

(1)参数复用 $.ajax

// 示例一
function ajax(type,url,data) {
var xhr = new XMLHttpRequest();
xhr.open(type,url,true);
xhr.send(data);
} var ajaxCurry = curry(ajax);
// 以GET请求为例
GET('www.baidu.com','name=Derry'); // 示例二
function add(a,b,c){
return a + b + c;
} const curryAdd = function(a){
return function(b){
return function(c){
return a + b + c;
}
}
} console.log(add(5,10,15)); // 结果30 const add5 = curryAdd(5); // 固定第一个参数。让表达式已经具有了一个参数5,向外暴露add5 console.log(add5(10)(15)); // 30

(2)提前返回 onclick... addEventListener()

// 示例一
var addEvent = function(el, type, fn, capture){
if(window.addEventListener){
el.addEventListener(type,function(e){
fn.call(el,e);
},capture);
}else if(window.attachEvent){ // 兼容6.7.8
el.attachEvent('on' + type,function(e){
fn.call(el,e);
})
}
} addEvent(a,'click',handleClick,true);
addEvent(a,'click',handleClick,true);
addEvent(a,'click',handleClick,true); // 示例二(优化版)
var addEvent = (function(){
if(window.addEventListener){
return function(el, type, fn, capture){
el.addEventListener(type,function(e){
fn.call(el,e);
},capture);
}
}else if(window.attachEvent){ // 兼容6.7.8
return function(el, type, fn, capture){
el.attachEvent('on' + type,function(e){
fn.call(el,e);
})
}
}
})() // 自运行函数(闭包)

(3)延迟执行 -> 不定参数

// 使用柯里化可以将函数的参数积累起来到某个触发点时再进行参数的执行
var totalScore = 0;
// 柯里化
var curryScore = function(fn){
var _totalScore = [];
return function(){
if(arguments.length === 0){
return fn.apply(null, _totalScore);
}else{
_totalScore = _totalScore.concat([].slice.call(arguments));
}
}
} var curryAddScore = curryScore(function(){
var i=0;len = arguments.length;
for(i;i<len;i++){
totalScore += arguments[i]
}
}); curryAddScore(3);
console.log(totalScore); // 0
curryAddScore(2);
console.log(totalScore); // 0
curryAddScore(1);
curryAddScore(1);
console.log(totalScore); // 0
curryAddScore(3);
curryAddScore(); // 参数为0的时候,才触发业务逻辑代码
console.log(totalScore); // 10

二、总结

// 柯里化封装
function curry(fn,args){
// 需要得到或者说判断 fn到底有几个参数 -- fn.length
var length = fn.length; // length 起到了延迟执行的触发判断条件
args = args || []; // args 参数复用
return function(){
var _args = args.slice(0), arg, i;
for(i=0; i<arguments.length; i++){
arg = arguments[i];
_args.push(arg);
}
if(_args.length < length){
return curry.call(this, fn, _args);
}else{
return fn.apply(this, _args);
}
}
} function add(a,b,c){
return a + b + c;
} var curryAdd = curry(add);
console.log(curryAdd(5)(10)(15)); // 30
console.log(curryAdd(5,10)(15)); // 30
console.log(curryAdd(5,10,15)); // 30
var curryAdd5 = curryAdd(5);
console.log(curryAdd5(10,15)); // 30

.

函数柯里化 curry的更多相关文章

  1. Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象

    1  参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...

  2. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  3. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  4. 前端进击的巨人(五):学会函数柯里化(curry)

    柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...

  5. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  6. 一道javascript面试题(闭包与函数柯里化)

    要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...

  7. 深入理解javascript函数进阶系列第二篇——函数柯里化

    前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...

  8. js高阶函数应用—函数柯里化和反柯里化

    在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...

  9. js高阶函数应用—函数柯里化和反柯里化(二)

    第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...

随机推荐

  1. mysql函数总结

    MySQL函数 MySQL数据库提供了很多函数包括: 数学函数:字符串函数:日期和时间函数:条件判断函数:系统信息函数:加密函数:格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数 ...

  2. Python解释器镜像源修改

    目录 Windows Mac 这篇文章将解除你使用python的pip install xxx受到的网速限制,如果只是下载较小的第三方库,可以尝试pip --default-timeout=100 i ...

  3. 关于EF使用脏读(连接会话开始执行设置隔离级别)

    SQL Server中事物隔离级别Read Uncommitted和with(nolock) 注意:应该使用后者(修改后的版本):

  4. 如何用Jquery做图片展示效果

    一. 前言 到底用JQuery做出怎样的展示效果? 让我们先来看一下!网页加载时,如图所示: 二.本人思路 这个效果初学者看起来好像有点复杂,其实不太难,关键是理清思路,从后端的数据库中找出我们要展示 ...

  5. Visual Studio 2013 中使用断点

    你可能已经很熟悉Visual Studio中的断点的基本功能.你在编辑器里代码的侧边点击,创建一个红色的圆点,然后运行应用程序,线程走到你所点的代码处停下,你可以用调试窗口查看代码状态. 你可能不熟悉 ...

  6. ssh执行远程服务器脚本 提示php: command not found

    ssh执行远程服务器脚本 提示php: command not found 设置环境变量 一台机器作为管理机,来管理其他服务器,并通过key认证,免密码登陆的. 在管理机上通过ssh登陆到其他服务器来 ...

  7. 路由重分发 最重要 最难 ccnp

    路由重分发   多种协议之间    彼此学习到对方的路由 重分发好   结果好 重分发不好   结果最好是产生次优路径      最差事产生路由黑洞和环路 实例1:    重分发一般需要双向重分发   ...

  8. python3--__radd__处理右侧加法

    __radd__处理右侧加法 从严格意义上来讲,前边例子中出现的__add__方法并不支持+运算符右侧使用实例对象.要实现这类表达式,而支持可互换的运算符,可以一并编写__radd__方法.+右侧的对 ...

  9. IndiaHacks 2nd Elimination 2017 (unofficial, unrated mirror, ICPC rules)

    D. Airplane Arrangements time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  10. iOS视频录制,裁剪(输出指定大小)

    弄了几天,终于搞懂一点了,博客后面再写,先附上demo,等研究清楚再写 demo地址:http://pan.baidu.com/s/1o6w2CMu