Javascript 闭包在Scala中是如何工作的?
我知道闭包是一个函数,其返回值取决于在其外部函数上定义的数据。在javascript中,我们可以像这样向内部函数发送参数Javascript 闭包在Scala中是如何工作的?,javascript,scala,closures,Javascript,Scala,Closures,我知道闭包是一个函数,其返回值取决于在其外部函数上定义的数据。在javascript中,我们可以像这样向内部函数发送参数 add(x) { return addplus(y) { let z = this.x + y ; return z; } } var op = add(10)(20); scala中的闭包是否也类似于javascript闭包?向scala中的内部
add(x) {
return addplus(y) {
let z = this.x + y ;
return z;
}
}
var op = add(10)(20);
scala中的闭包是否也类似于javascript闭包?向scala中的内部函数发送参数是否太有效?闭包是一个函数,它捕获定义它的外部作用域,因此可以访问在其自身作用域之外定义的实体 闭包的一个可能用途是您所描述的闭包,尽管利用闭包的技术(如注释中所述)称为currying,即将具有
n
参数的函数建模为具有一个参数的函数,该参数返回具有n
-1个参数的函数
您可以在Scala中逐行移植Javascript代码:
def add(x: Int): Int => Int =
y => x + y
另外,请注意Scala对咖喱的本机支持:
def add(x: Int)(y: Int): Int =
x + y
这两个函数在语义上是等价的,通过部分应用这两个函数中的任何一个,可以得到一个函数,该函数返回一个将x
和其参数相加的函数。它也可以完全应用
val following: Int => Int = add(1)
val two = following(1)
val three = following(two)
val four = add(two)(two)
你是说
add
返回一个函数,你把它作为参数传递给y
。对我来说,它看起来更像是一种咖喱而不是克洛苏耶,只是更新了这个问题。措辞很好!为了完整起见,您可以添加关于部分应用函数的注释,作为实现相同功能的另一种方法。虽然您的curriedadd
仍然可以被视为具有闭包y=>x+y,但对于PAF,没有任何闭包,但是您可以获得相同的功能(例如def add(x:Int,y:Int):Int=x+y;val following:Int=>Int=add(1,41;
)。不过我还是喜欢咖喱。。。更多的功能和更少的下划线:)啊,看来我需要彻底检查scala文档。你解释得很好。谢谢你抽出时间。