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了
分享到:
相关推荐
3. **封装**:闭包提供了一种方式来封装变量和函数,防止它们被外部代码直接修改,有助于实现模块化。 下面是一个简单的闭包示例: ```javascript function outer() { var count = 0; function inner() { ...
【闭包的概念与应用场景】 闭包是JavaScript编程中一个核心概念,它指的是一个函数能够访问并操作其外部作用域中的...理解闭包对于深入掌握JavaScript编程至关重要,尤其是在处理异步操作、数据封装和性能优化等方面。
在JavaScript中,实现函数柯里化通常涉及到闭包和函数的返回。下面是一个通用的柯里化函数封装示例: ```javascript function curry(func) { const arity = func.length; return function curried(...args) { ...
JavaScript 中几种重要的高阶函数及其应用方式,其中包括通过 rest 参数传递任意参数(addArrayElements 函数)、数组映射转换(arrToString 方法)、闭包用于封装状态计数器(makeCounter 函数)、柯里化(curry 化...
闭包常用于实现私有变量、数据封装和创建记忆化的函数等。 例如: ```javascript function outerFunction(outerVar) { return function innerFunction() { console.log(outerVar); }; } let closureInstance = ...
在JavaScript中,`map`、`filter`、`reduce`等方法都是高阶函数的例子,它们用于操作数组,而`compose`和`curry`则用于组合和封装函数。 4. 闭包 闭包是函数能够访问其词法作用域内的变量,即使在其定义的作用域...
Swift中的函数柯里化,是一种将多参数函数转化为一系列单参数函数的过程,使得函数可以逐步接收参数,并在所有参数提供完整之前返回一个新函数。这种技术源于数学家哈斯凯尔·伽罗瓦(Haskell Curry)的名字,因此被...
这对于状态管理、模块封装和内存优化等场景非常有用。 6. **柯里化(Currying)**:利用头等函数,我们可以实现柯里化,即将接受多个参数的函数转换为一系列接受单个参数的函数。例如: ```javascript function ...
闭包常常与Lambda表达式一起使用,以创建私有变量和封装数据。 在JavaScript的上下文中,"有趣的JS的演算"还可能涵盖了一些高级技巧,如高阶函数、函数组合、函数记忆等。高阶函数是指可以接受一个或多个函数作为...
- 高阶函数:map、reduce、filter等函数的使用,以及函数作为参数和返回值的应用。 - 状态不可变性:理解如何避免修改原始数据,以减少副作用。 - curry化和partial application:提高函数的可组合性。 5. **DOM...
这在JavaScript中可以通过闭包实现,使得函数能接受部分参数,并返回一个接受剩余参数的新函数。例如,`curry(function(a, b, c) { return a + b + c; })(2)(3)(4)`。 4. **函数组合(Composition)**:函数组合是将...
闭包在函数式编程中用于创建私有变量和实现封装。 4. **柯里化**:柯里化是一种将接受多个参数的函数转换为接受单一参数并返回新函数的技术。这种技术有助于实现函数的组合和部分应用。 5. **函数组合**:函数组合...
在实际项目中,我们可以利用柯里化来创建更灵活、可复用的函数,例如创建具有默认参数的函数、构建复杂的计算表达式或者封装特定功能。例如,你可以创建一个柯里化的`map`函数,用于遍历数组并应用给定的函数,这样...
2. 函数式编程:高阶函数、闭包、 curry化、柯里化等特性。 3. 异步编程:事件循环、回调函数、Promise、async/await等。 4. 模块系统:CommonJS、ES6模块、AMD、UMD等加载方式。 四、JavaScript框架与库 1. React...
内部函数可以访问外部函数的参数和变量,这是闭包特性的一个体现。 返回函数的核心在于,外部函数执行后不返回值,而是返回一个新的函数对象。这个新的函数可以具有特定的职责,例如处理特定的数据或者执行特定的...
5. **函数式编程**:JavaScript也具有函数式编程的特点,如高阶函数、闭包和 curry 化等,这部分内容可以帮助开发者写出更简洁、可维护的代码。 6. **异步编程**:JavaScript的异步处理是其独特之处,涉及到回调...