JavaScript柯里化

什么是柯里化

柯里化允许我们把函数与传递给它的参数结合,产生一个新的函数。[引自《JavaScript语言精髓》,第43页 柯里化]

A function is said to be curried when not all arguments have been supplied to the function, so it returns another function that retains the arguments given and expects the remaining arguments.[引自《JavaScript: Novice to Ninja》,第317页 Currying]

当一个函数没有传入全部所需参数时,它会返回另一个函数(这个返回的函数会记录那些已经传入的参数),这种情况叫作柯里化。

简单的说柯里化就是通过传入函数所需的部分参数,将一个函数分割为多个的一种技术。

参考如下例子:

function multiplier(x, y){
    if(y===undefined){
        return function(z){
            return x * z;
        }
    }else{
        return x*y;
    }
}

当只传入参数x的时候multiplier会返回一个新的函数,并且这个函数会记录之前传递的x的值(闭包特性)。 这时如下两种调用是等价的:

multiplier(3, 4);
multiplier(3)(4);

通用的柯里化方法

[代码引自《JavaScript: Novice to Ninja》,第319页 A General Curry Function]

function curry(func) {
  var fixedArgs = [].slice.call(arguments,1);
  return function() {
    args = fixedArgs.concat([].slice.call(arguments))
    return func.apply(null, args);
  };
}

以以下例子说明curry运行过程。

function divider(x,y) {
  return x/y;
}
reciprocal = curry(divider,1);
reciprocal(2);

执行reciprocal(2)相当于执行curry(divider,1)(2)。然后看curry方法通过[].slice方法去掉了传入的第一个参数,即function divider(x,y) {return x/y;},之后保留了变量x=1并返回一个新的函数,这是一个匿名函数,同时传入变量y=2,这时fixedArgs.concat([].slice.call(arguments))将之前传入的变量x和现在传入的变量y重新组合成一个数组,最后执行函数divider,这时使用的参数是组合后的[1,2]。整个curry方法主要工作就是组织两次传入的参数,然后通过apply方式调用函数。

柯里化作用

Curring allows you to turn a single function into a series of functions instead. This is useful if you find that you’re constantly calling a function with the same argument.[代码引自《JavaScript: Novice to Ninja》,第318页]

柯里化允许你将一个函数转换为一些列函数,在经常调用一个相同参数的函数时,柯里化是很好的解决方案。

比如要做一个打折运算时,tax = multiplier(0.22,400);这个折扣基本都0.22的情况下,就可以定义一个函数calcTax = multiplier(0.22);这样再作这个折扣计算时就省去了一个参数的传递:calcTax(400);

命名由来

The name "currying", coined by Christopher Strachey in 1967, is a reference to logician Haskell Curry[引自维基百科, currying, naming]

柯里化命名来源于Haskell Curry,Moses Schönfinkel提出这个概念后,Haskell Curry通过计算机实现了它。后来于1967年由Christopher Strachey命名为curying。

参考博客:

浅析 JavaScript 中的 函数 currying 柯里化

为什么要柯里化

时间: 2024-10-11 12:48:51

JavaScript柯里化的相关文章

javascript柯里化及组合函数~

大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西,基本每个稍微复杂点的例子都要涉及这两个函数.什么是curry呢?---函数柯里化.就是这个东西了.举一个简单的例子. var _console=curry(function(x){ console.log(x); }) _console("hello"); //hello 其实就这个作用

201602021344_《Javascript柯里化uncurrying()(将内置方法独立成为一个通用方法)》

Function.prototype.uncurrying = function() { var that = this; return function() { return Function.prototype.call.apply(that, arguments); } }; function add(a,b){ return a + b; }; var myAdd = add.uncurrying(); console.log(add(5,6));// 11

JavaScript的柯里化函数

柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写 JavaScript 代码的人来说可能会很费解.但如果使用得当,它可以使你的 JavaScript 函数更具可读性. 更具可读性和灵活性 函数式 JavaScript 被吹捧的优点之一就是拥有短小紧凑的代码风格,可以用最少行数.更少重复的代码得到正确的结果.有时这会以牺牲可读性为代价:如果你还不熟悉函数式编程的方法,这种方法写的代码会很难阅读和理解. 如果之前你遇到过柯里化这个术语,但是不知道它是什么意思,把它当做奇怪的.难

Javascript与柯里化

一.柯里化和柯南的关系是? 回答:如果我说“柯里化 == 柯南”呢?众人:博主,r u ok!? 是不是钓鱼钓久了脑袋秀逗了哈?柯里化可是函数式编程中的一个技巧,而柯南是到哪儿哪儿死人.10年不老的神话般的存在.八竿子都打不到的,怎会相等呢?? 回答:诸位,眼睛睁大点,是==, 不是===哦~众人:嗯哪,我眼睛已经瞪得灯泡大了,粑粑并没有变冰淇淋啊? 回答:这不就结了嘛.我说的是弱等于==, 又不是强等于===. 你想那,JS的世界里,0==false. 你看,这阿拉伯届的数字0,和英美届的单词

JavaScript函数柯里化

函数式 JavaScript是以函数为一等公民的函数式语言.函数在JavaScript中也是一个对象(继承制Function),函数也可以作为参数传递成函数变量.最近几年函数式也因为其无副作用的特性.透明性.惰性计算等在高并发,大数据领域火起来了. JavaScript中也有如Underscore.lodash之类的函数式库,如lodash的使用方式: var names = _.chain(users) .map(function(user){ return user.user; }) .jo

浅析 JavaScript 中的 函数 currying 柯里化

原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个

柯里化函数之Javascript

柯里化函数之Javascript 定义 根据定义来说,柯里化就是将一个接收"多个"参数的函数拆分成一个或者许多个接收"单一"参数的函数.定义看起来是比较抽象的,下面来举个例子: 代码 1 2 3 4 5 function concat(str1,str2){ return str1 + str2; } concat("forever","px") // "foreverpx" 不难理解,上面的代码中定义了一

JavaScript 反柯里化

浅析 JavaScript 中的 函数 uncurrying 反柯里化 柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程.请见我的另一篇博客· 浅析 JavaScript 中的 函数 currying 柯里化 反柯里化 相反,反柯里化的作用在与扩大函数的适用性,使本来作为特定对象所拥有的功能的函数可以

Effective JavaScript Item 26 使用bind来进行函数的柯里化(Curry)

本系列作为Effective JavaScript的读书笔记. 在上一个Item中介绍了bind的一种用法:用来绑定this对象.但是实际上,bind含有另一种用法,就是帮助函数进行柯里化.关于柯里化,这里有一份百科可以参考: http://zh.wikipedia.org/wiki/%E6%9F%AF%E9%87%8C%E5%8C%96 但是实际上,关于柯里化只需要记住一点就够了:柯里化是把接受多个参数的函数变换成接受一个单一参数(通常是最初函数的第一个参数,但是并无限制)的函数,并且返回这个