`

curry和闭包封装参数的区别

阅读更多
from: http://hamletdarcy.blogspot.com/2008/01/curry-vs-closure-wrapping-in-groovy.html

这篇文章讲了使用curry来bind参数和使用闭包bind参数的一些区别, 觉得对理解curry和闭包不错, 简单的翻译了下

首先是一个例子:
def concat = { x, y ->
 x + delegate.call() + y
}

concat.delegate = { " " }

assert concat("Hello", "World") == "Hello World"

注意delegate.call()的用法, 这里的delegate可以看成是一个变量, 可以随时在调用concat前进行修改, 比如用逗号, 分号来分隔

在大多数情况使用curry和使用闭包的效果是一样的.

比如在curry中可以这样写:
def hello = concat.curry("Hello")
assert hello("World") == "Hello World"


使用闭包可以这样写:
def hello = { x -> concat("Hello", x) }
assert hello("World") == "Hello World"


二者稍微有些区别, 在curry中定义的hello是CurriedClosure的实例, 而第二个hello是Closure的实例, 当然还有一个区别是curry绑定的参数是从左到右的(现在的rcurry, ncurry可以解决参数的顺序问题), 而使用闭包则相对灵活些.

这里我要说的是他们在对待delegate这个分隔符的区别.
对于curry, 效果是这样的:
def hello = concat.curry("Hello")
hello.delegate = { "," }
assert hello("World") == "Hello,World"


而对于闭包, 效果却是这样的:
def hello = { x -> concat("Hello", x) }
hello.delegate = { "," }
assert hello("World") == "Hello World"


出现不同的结果的解释是: 对于curry来说, 得到的CurriedClosure可以认为是对原有的concat闭包的一个继承, 因此得到的hello可以使用delegate, 而对于闭包来说, 是使用了一个新的闭包hello来包装了concat闭包, 因此hello就无法获取contat的delegate了
分享到:
评论
2 楼 macrochen 2010-10-22  
JohnnyJian 写道
引用
concat.delegate = { " " }

像这样子修改闭包的delegate我觉得是不值得推荐的,因为delegate有特殊的语义(在闭包中找不到的方法和变量会在delegate中查找)。
这里应该用一个参数来表示连接符,而不是通过delegate。

估计作者只是用这个例子来说明它的观点, 而实际应用中通过参数的方式可能更合适
1 楼 JohnnyJian 2010-10-21  
引用
concat.delegate = { " " }

像这样子修改闭包的delegate我觉得是不值得推荐的,因为delegate有特殊的语义(在闭包中找不到的方法和变量会在delegate中查找)。
这里应该用一个参数来表示连接符,而不是通过delegate。

相关推荐

    js代码-闭包&curry

    3. **封装**:闭包提供了一种方式来封装变量和函数,防止它们被外部代码直接修改,有助于实现模块化。 下面是一个简单的闭包示例: ```javascript function outer() { var count = 0; function inner() { ...

    2021大厂前端面试高频代码题详解(二)1

    【闭包的概念与应用场景】 闭包是JavaScript编程中一个核心概念,它指的是一个函数能够访问并操作其外部作用域中的...理解闭包对于深入掌握JavaScript编程至关重要,尤其是在处理异步操作、数据封装和性能优化等方面。

    js代码-函数柯里化通用封装

    在JavaScript中,实现函数柯里化通常涉及到闭包和函数的返回。下面是一个通用的柯里化函数封装示例: ```javascript function curry(func) { const arity = func.length; return function curried(...args) { ...

    深入解析 JavaScript 中的高阶函数与函数式编程技巧

    JavaScript 中几种重要的高阶函数及其应用方式,其中包括通过 rest 参数传递任意参数(addArrayElements 函数)、数组映射转换(arrToString 方法)、闭包用于封装状态计数器(makeCounter 函数)、柯里化(curry 化...

    js代码-1、Js练习:闭包、函数柯里化、递归综合

    闭包常用于实现私有变量、数据封装和创建记忆化的函数等。 例如: ```javascript function outerFunction(outerVar) { return function innerFunction() { console.log(outerVar); }; } let closureInstance = ...

    JavaScript函数式编程

    在JavaScript中,`map`、`filter`、`reduce`等方法都是高阶函数的例子,它们用于操作数组,而`compose`和`curry`则用于组合和封装函数。 4. 闭包 闭包是函数能够访问其词法作用域内的变量,即使在其定义的作用域...

    Swift中的函数柯里化 Function Currying

    Swift中的函数柯里化,是一种将多参数函数转化为一系列单参数函数的过程,使得函数可以逐步接收参数,并在所有参数提供完整之前返回一个新函数。这种技术源于数学家哈斯凯尔·伽罗瓦(Haskell Curry)的名字,因此被...

    Web-前端教程34 JS进阶:头等函数.zip

    这对于状态管理、模块封装和内存优化等场景非常有用。 6. **柯里化(Currying)**:利用头等函数,我们可以实现柯里化,即将接受多个参数的函数转换为一系列接受单个参数的函数。例如: ```javascript function ...

    有趣的JS的演算

    闭包常常与Lambda表达式一起使用,以创建私有变量和封装数据。 在JavaScript的上下文中,"有趣的JS的演算"还可能涵盖了一些高级技巧,如高阶函数、函数组合、函数记忆等。高阶函数是指可以接受一个或多个函数作为...

    javascript高级教程

    - 高阶函数:map、reduce、filter等函数的使用,以及函数作为参数和返回值的应用。 - 状态不可变性:理解如何避免修改原始数据,以减少副作用。 - curry化和partial application:提高函数的可组合性。 5. **DOM...

    实用函数式Javascript.zip

    这在JavaScript中可以通过闭包实现,使得函数能接受部分参数,并返回一个接受剩余参数的新函数。例如,`curry(function(a, b, c) { return a + b + c; })(2)(3)(4)`。 4. **函数组合(Composition)**:函数组合是将...

    JavaScript 函数式编程 (英文版)

    闭包在函数式编程中用于创建私有变量和实现封装。 4. **柯里化**:柯里化是一种将接受多个参数的函数转换为接受单一参数并返回新函数的技术。这种技术有助于实现函数的组合和部分应用。 5. **函数组合**:函数组合...

    js代码-JS 函数柯里化demo

    在实际项目中,我们可以利用柯里化来创建更灵活、可复用的函数,例如创建具有默认参数的函数、构建复杂的计算表达式或者封装特定功能。例如,你可以创建一个柯里化的`map`函数,用于遍历数组并应用给定的函数,这样...

    在战斗中召唤机械师_JavaScript_下载.zip

    2. 函数式编程:高阶函数、闭包、 curry化、柯里化等特性。 3. 异步编程:事件循环、回调函数、Promise、async/await等。 4. 模块系统:CommonJS、ES6模块、AMD、UMD等加载方式。 四、JavaScript框架与库 1. React...

    js返回另一个函数

    内部函数可以访问外部函数的参数和变量,这是闭包特性的一个体现。 返回函数的核心在于,外部函数执行后不返回值,而是返回一个新的函数对象。这个新的函数可以具有特定的职责,例如处理特定的数据或者执行特定的...

    javascript10 宝典.zip

    5. **函数式编程**:JavaScript也具有函数式编程的特点,如高阶函数、闭包和 curry 化等,这部分内容可以帮助开发者写出更简洁、可维护的代码。 6. **异步编程**:JavaScript的异步处理是其独特之处,涉及到回调...

Global site tag (gtag.js) - Google Analytics