从维基百科

时间:2016-06-10 16:56:52

标签: closures

以下是维基百科article

的闭包示例
function startAt(x)
   function incrementBy(y)
       return x + y
   return incrementBy

variable closure1 = startAt(1)
variable closure2 = startAt(5)

根据文章

  

调用closure1(3)将返回4,而调用closure2(3)将返回8.

幕后发生了什么?

  1. 为什么这段代码不会在真正的编程语言中抛出任何错误? incrementBy需要第二个变量来做总和,不是吗?

  2. 当我们用一个参数调用closure()时,我是否正确将它分配给incrementBy范围内的y?

  3. 我是否正确将closure2两个绑定到与closure1绑定到的记录不同的记录?

1 个答案:

答案 0 :(得分:0)

  

为什么这段代码不会在真正的编程语言中抛出任何错误? incrementBy需要第二个变量来做总和,不是吗?

为什么会抛出错误?是incrementBy使用两个变量xy,但它们都已定义。调用x时,5被定义为startAt(5)。在调用y时,3被定义为closure2(3)

  

当我们用一个参数调用closure()时,我是否正确将它分配给incrementBy范围内的y?

是的,你在 a y内签署incrementBy是正确的,但请注意,有多个函数名为{ {1}}。每次调用incrementBy时都会创建一个。在您的代码中,有两个单独的startAt函数由两个incrementBy调用创建,每个函数都有自己的上下文,其范围内包含自己的startAt

  

我是否正确将closure2 two绑定到与封闭1绑定到的记录不同的记录?

是的,xclosure2是两个独立的函数,它们都是closure1的副本,但在不同的上下文中。