2014-11-14 41 views
0

在维基百科(http://en.wikipedia.org/wiki/Closure_(computer_programming))的此示例中,它声称调用变量closure1closure1(3)将返回4。有人可以通过这个例子 - 我不明白。关闭 - 澄清变量和函数

function startAt(x) 
    function incrementBy(y) 
     return x + y 
    return incrementBy 

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

Invoking the variable closure1 (which is of function type) with closure1(3) will return 4, while invoking closure2(3) will return 8. While closure1 and closure2 are both references to the function incrementBy, the associated environment will bind the identifier x to two distinct variables in the two invocations, leading to different results. 

如果有帮助,这是我目前的理解。 variable closure1 = startAt(1)将变量closure1设置为功能startAt(),其默认初始化为1。但是,调用closure1(3)会将此默认值设置为3。我不明白的是y来自哪里。

variable closure1 = startAt(1) 
+0

相关:[JavaScript关闭如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – apsillers 2014-11-14 14:49:56

+0

关闭只是可怜的人类。类只是穷人关闭。 – leppie 2014-11-14 15:24:05

回答

0

当您运行startAt,你创建一个新的功能。每次运行startAt时,都会创建一个全新的功能。因此,我们的理解是代码

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

创建两个不同的功能和将它们存储在colsure1closure2函数startAt就像是一个返回新函数的工厂。你已经调用了两次,并创建了两个函数。这两个创建的函数存储在closure1closure2之内。

以下是“关闭”的含义:每个功能都围绕自己的可变环境龋齿。变量环境是函数可以看到的一组外部变量。一个函数根据当前在范围内的所有变量创建它的变量环境。 (封闭的技术定义是:“功能代码变量环境”。)

何时startAt调用创建一个新的功能,新的功能构建其可变环境。新函数的变量环境包括在startAt的特定调用范围内存在的变量x

因此,第一次打电话给startAt(1)有一个变量x,等于1。在startAt调用中创建的函数具有可变环境,包括x等于1.

函数可以有参数。由startAt创建的函数每个都需要一个名为y的参数。因此,在调用创建的函数时执行x + y时,y作为该特定调用的参数提供,x由该函数的变量环境提供。当您拨打closure1(3)时,参数y的值为3,并且值x(来自函数的可变环境)为1,因此您会得到结果4

第二次致电startAt创建了一个全新变量x。该x的值为5。第二次调用startAt创建的函数具有不同的可变环境,其中包括这个新的x,其值为5。当你用closure2(3)调用新创建的函数时,我们有x=5y=3,所以x+y给出结果8

+0

我明白:“第一次调用startAt(1)的变量_x_等于1.”我不这样做:“由startAt创建的函数每个都需要一个名为_y_的参数”。 'y'从哪里来? – Snowcrash 2014-11-14 19:47:31

+0

@SnowCrash从创建函数的定义:注意'函数incrementBy(y)'中的'y'。参数是函数局部变量(其值为函数调用时间)。通过指定一个形式参数'y',你可以说:“每当这个函数被调用时,它就会被提供一个值,我们称这个提供的值为'y'。 – apsillers 2014-11-14 20:06:24