Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包在Scala中是如何工作的?_Javascript_Scala_Closures - Fatal编程技术网

Javascript 闭包在Scala中是如何工作的?

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中的内部

我知道闭包是一个函数,其返回值取决于在其外部函数上定义的数据。在javascript中,我们可以像这样向内部函数发送参数

    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
。对我来说,它看起来更像是一种咖喱而不是克洛苏耶,只是更新了这个问题。措辞很好!为了完整起见,您可以添加关于部分应用函数的注释,作为实现相同功能的另一种方法。虽然您的curried
add
仍然可以被视为具有闭包y=>x+y,但对于PAF,没有任何闭包,但是您可以获得相同的功能(例如
def add(x:Int,y:Int):Int=x+y;val following:Int=>Int=add(1,41;
)。不过我还是喜欢咖喱。。。更多的功能和更少的下划线:)啊,看来我需要彻底检查scala文档。你解释得很好。谢谢你抽出时间。