javascript - Java lambda 是否等同于 JavaScript 闭包?

标签 javascript java lambda functional-programming closures

我开始学习函数式编程,对此我有点困惑。

我的问题是:Java lambda 等同于JavaScript 闭包吗?如果不是,它们之间有什么区别?

最佳答案

它们“略有不同”,也“大致相同”。

tldr;访问外部范围变量1 的 Java lambda 也是闭包;并且不访问外部作用域变量的 JavaScript“闭包”严格来说不是闭包(更准确地说,可以称为匿名函数2)。


在 JavaScript 中,闭包通常意味着“能够在外部范围内重新分配变量”——但是,访问或“关闭/绑定(bind)”一个变量对于匿名对象来说就足够了函数成为闭包3

Java lambda 要求在 lambda 中访问的所有来自外部作用域的变量都是有效的最终,这意味着它们不能被重新分配。

1The rule is that a [Java] lambda expression can only access local variables from an enclosing scope that are effectively final. An effectively final variable is never modified—it either is or could be declared as final - http://www.informit.com/articles/article.aspx?p=2303960

但是,由于 Java lambda 可以捕获绑定(bind)到可变对象的只读变量,因此 Java lambda 可以间接修改外部上下文中的状态,因此可以模拟以下能力: “重新分配”值。

2In computer science, a closure is a function that has an environment of its own. Inside this environment, there is at least one bound variable [and] anonymous functions are sometimes wrongly called closures. This is probably because most languages [eg. JavaScript] that have anonymous functions also have closures and it's common for programmers to learn about both at the same time. - https://simple.wikipedia.org/wiki/Closure_(computer_science)

Java 在 lambda 与 JS 匿名函数/闭包中的 this 上也有不同的语义;另见 JavaScript "arrow functions"this 的行为方式上,它与传统的匿名函数有不同的规则。


3 琐碎的论点:

关于javascript - Java lambda 是否等同于 JavaScript 闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43989534/

相关文章:

javascript - AngularJS 选择框触发器

java - Cascade.Remove 不适用于 OneToOne

c++ - 错误 C2064 : term does not evaluate to a function taking 1 argument - Lambda function

java - Swing Worker 中的优雅异常处理

loops - 如何将for循环转换为stream循环

javascript - 如何使用 AWS JavaScript SDK (dynamoDB) 处理 UnprocessedItems?

javascript - Chart.js:组合线和条数据

javascript - CSS - 防止文本在调整大小时移动

javascript - IE输入清除图标有时不触发change事件

java - 获取修改文件更改事件?