函数柯里化 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高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
随机推荐
- Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上 ...
- python中实现格式化输出 %用法
当我们在python中需要打印出特定格式的内容时可以用到这个方法,方法介绍如下: 例如我们现在要收集用户的一些个人信息,这时候我们的代码如下: name=input("name: " ...
- LeetCode(95) Unique Binary Search Trees II
题目 Given n, generate all structurally unique BST's (binary search trees) that store values 1-n. For ...
- python中strip(),lstrip(),rstrip()函数的讲解
1. strip() 它的函数原型:string.strip(s[, chars]),它返回的是字符串的副本,并删除前导和后缀字符.(意思就是你想去掉字符串里面的哪些字符,那么你就把这些字符当参数传入 ...
- Knockout v3.4.0 中文版教程-16-控制流-foreach绑定
2. 控制流 1. foreach绑定 目的 foreach绑定会遍历一个数组,为每个数组项生成重复的元素标记结构并做关联.这在渲染列表或表格的时候特别有用. 假设你的数组是一个监控数组,之后无论你进 ...
- Python基础之字符编码,文件操作流与函数
一.字符编码 1.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit ...
- Wp8 读取手机信息
/// <summary> /// 获取系统信息 /// </summary> private void GetSystemInfo() { lblMsg.Text = str ...
- hdu 4251 The Famous ICPC Team Again划分树入门题
The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...
- BZOJ2241 [SDOI2011]打地鼠 【模拟】
题目 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地 ...