我开始学习函数式编程,对此我有点困惑。
我的问题是: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 琐碎的论点:
- Haskell has closures .
- Haskell does not allow variables to be re-assigned .
- 因此,重新分配(或可变性)不是闭包的要求。
关于javascript - Java lambda 是否等同于 JavaScript 闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43989534/