gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:48 25 4
gpt4 key购买 nike

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

我的问题是: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com