在维基百科(http://en.wikipedia.org/wiki/Closure_(computer_programming))的这个示例中,它声称使用closure1
调用变量closure1(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 :(得分:0)
当您运行startAt
时,您创建新功能。每次运行startAt
时,您都会创建一个全新的功能。因此,我们了解代码
variable closure1 = startAt(1)
variable closure2 = startAt(5)
创建两个不同的函数,并将它们存储在colsure1
和closure2
中。 函数startAt
就像一个返回新函数的工厂。您已经调用了两次,并创建了两个函数。这两个创建的函数存储在closure1
和closure2
内。
这里"关闭"意味着:每个函数都围绕自己的变量环境进行龋齿。变量环境是函数可以看到的外部变量集。函数在创建时根据当前范围内的所有变量构建其变量环境。 (闭包的技术定义是:" 功能代码加上变量环境"。)
当调用startAt
创建一个新函数时,该新函数会构建其变量环境。新函数的可变环境包括在x
的特定调用中存在于范围内的变量startAt
。
因此,第一次调用startAt(1)
的变量x
等于1
。在对startAt
的调用中创建的函数具有可变环境,其中x
等于1.
函数可以有参数。 startAt
创建的函数每个都期望一个名为y
的参数。因此,当您在调用创建的函数时执行x + y
时,y
作为该特定调用的参数提供,x
由该函数的可变环境提供。当您致电closure1(3)
时,参数y
的值为3
,x
的值(来自函数的变量环境)为{{1} },所以你得到结果1
。
第二次调用4
会创建全新变量 startAt
。此x
的值为x
。第二次调用[{1}}时创建的函数具有不同的变量环境,其中包括值为5
的新startAt
。当您使用x
调用新创建的函数时,我们有5
和closure2(3)
,因此x=5
会得到结果y=3
。