一、函数柯里化的特性:

(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. I2C驱动框架(四)

    参考:I2C子系统之platform_driver初始化——I2C_adap_s3c_init() 在完成platform_device的添加之后,i2c子系统将进行platform_driver的注 ...

  2. HDU 3506 DP 四边形不等式优化 Monkey Party

    环形石子合并问题. 有一种方法是取模,而如果空间允许的话(或者滚动数组),可以把长度为n个换拓展成长为2n-1的直线. #include <iostream> #include <c ...

  3. 织梦dedecms自定义表单设置必填项

    1. 用php验证 在plus/diy.php的第 40行下加 //增加必填字段判断 if($required!=''){ if(preg_match('/,/', $required)) { $re ...

  4. Java-获取一个类的父类

    如何使用代码获取一个类的父类 package com.tj; public class MyClass implements Cloneable { public static void main(S ...

  5. 三、harbor部署之SSL

    1 签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名证书:由服务器自己颁发给自己,用于证明自己身份的东西,非权威颁发机构发布. 2 openssl简介 ...

  6. BZOJ 3450 Tyvj1952 Easy ——期望DP

    维护$x$和$x^2$的期望递推即可 #include <map> #include <ctime> #include <cmath> #include <q ...

  7. USACO Longest Prefix

    题目大意:给出一个长字符串,问最长的前缀,使得这个前缀能用给出的一些元素组合而成 思路:暴力dp,dp[i]表示长度为i的前缀能否被表示 /*{ ID:a4298442 PROB:prefix LAN ...

  8. java date类型和calendar类型区别

    Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...

  9. tomcat设置去项目路径

    1. 新建一个目录专门用于存放工程, 如: G:\apache-tomcat-6.0.20\project 2. 将工程存放到以上目录下:即:G:\apache-tomcat-6.0.20\proje ...

  10. Codevs 2956 排队问题

    2956 排队问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 有N个学生去食堂,可教官规定:必须2人或3人组成一组,求有多少种不 ...