函数柯里化 curry
一、函数柯里化的特性:
(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的更多相关文章
- Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象
1 参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- JavaScript函数柯里化的一些思考
1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- 一道javascript面试题(闭包与函数柯里化)
要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...
- 深入理解javascript函数进阶系列第二篇——函数柯里化
前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
随机推荐
- linux定时任务执行php任务
首先用命令检查服务是否在运行 systemctl status crond.service 如果服务器上没有装有crontab ,则可以执行 yum install vixie-cron yum in ...
- JavaScript内建对象-String
JavaScript中通过双引号或单引号界定一个字符串. String对象只有一个属性:length属性,得到字符串的长度. 处理字符串本身的方法 charAt(index) 返回字符串中index指 ...
- Python内置函数7
Python内置函数7 1.propertypython内置的一个装饰器可参考https://blog.csdn.net/u013205877/article/details/77804137 2.q ...
- Python内置函数5
Python内置函数5 1.format参考前面字符串方法中的format 2.frozenset([iterable]) iterable -- 可迭代的对象,比如列表.字典.元组等等 返回一个冻结 ...
- AbstractFactory(抽象工厂模式)
AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...
- OSPF 提升 一 ----基础
ospf ccnp内容 一 link-state protocols IGP 开放式的最短路径优先协议 公有协议 支持中到大型的网络 spf算法 链路状态协议 1. ...
- BNUOJ 1207 滑雪
滑雪 Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 10886 ...
- 【C#】最后总结
导读:要想收获,就逃不开总结.一直拖着拖着,再也无法忍受了.应该说是又学习迷茫了,所以,我要总结.一直都觉得自己总结不出来,或者是看了别人的优秀总结,心里就打鼓,不敢下笔.现在,化用一下:但热闹是他们 ...
- 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...
- 性能测试之五--webservices接口测试
下面我们进行webservices接口的讲解,包括脚本生成,参数化和关联. 以天气预报的接口为例,接口地址为: http://ws.webxml.com.cn/WebServices/WeatherW ...