我理解闭包是一个函数,其返回值取决于在其外部函数上定义的数据。在javascript中,我们可以将参数发送到内部函数,如
add(x) {
return addplus(y) {
let z = this.x + y ;
return z;
}
}
var op = add(10)(20);
scala中的闭包是否与javascript闭包相似?将参数发送到scala中的内部函数是否有效?
答案 0 :(得分:4)
闭包是捕获定义它的外部作用域的函数,因此可以访问在其自己的作用域之外定义的实体。
闭包的一种可能用法就是你所描述的那个,尽管利用它的技术(如评论中所述)被称为 currying ,即使用n
参数建模函数作为一个有一个参数,返回一个带n
- 1个参数的函数。
您可以在Scala中逐行移植Javascript代码:
def add(x: Int): Int => Int =
y => x + y
另外,请注意Scala本身支持currying:
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)