Data structures “这对”意味着什么;“收尾”;某物

Data structures “这对”意味着什么;“收尾”;某物,data-structures,closures,Data Structures,Closures,我试图理解闭包,但从字面上看,我能找到的每个闭包定义都使用了同样神秘而模糊的短语:“closeover” 什么是结束?“哦,这是一个函数,它关闭了另一个函数。” 但我找不到“结束”的定义。有人能解释一下事物A“关闭”事物B意味着什么吗?闭包是由代码指针和环境指针组成的一对。环境指针包含给定函数的所有自由变量。例如: funf(a,b)= 让fung g(c,d)=a+b+c+d 最后 valg=f(1,2) val结果=g(3,4)(*应该是10*) 函数g包含两个自由变量:a和b。如果您不熟

我试图理解闭包,但从字面上看,我能找到的每个闭包定义都使用了同样神秘而模糊的短语:“closeover”

什么是结束?“哦,这是一个函数,它关闭了另一个函数。”


但我找不到“结束”的定义。有人能解释一下事物A“关闭”事物B意味着什么吗?

闭包是由代码指针和环境指针组成的一对。环境指针包含给定函数的所有自由变量。例如:

funf(a,b)=
让fung g(c,d)=a+b+c+d
最后
valg=f(1,2)
val结果=g(3,4)(*应该是10*)
函数
g
包含两个自由变量:
a
b
。如果您不熟悉自由变量这个术语,那么它是一个未在函数范围内定义的变量。在此上下文中,关闭某个对象意味着从函数中删除自由变量的任何引用。上面的例子为闭包提供了很好的动机。当函数
f
返回时,我们需要能够记住
a
b
的值,以便以后使用。编译方法是将函数
g
视为代码指针和包含所有自由变量的记录,例如:

fung g(c,d,env)=环境a+env.b+c+d
funf(a,b,env)=(g,{a=a,b=b})
val(g,gEnv)=f(1,2)
val结果=g(3,4,gEnv)
当我们应用函数
g
时,我们提供调用函数
f
时返回的环境。请注意,现在函数
g
不再出现未在其范围内定义的变量。我们通常将没有任何自由变量的项称为闭合项。如果您还不清楚,Matt可能会在下面对闭包转换有一个非常深入的解释

Javascript中的相同示例 闭包转换前

函数f(a,b){
函数g(c,d){
返回a+b+c+d
}
返回g
}
var g=f(1,2)
var结果=g(3,4)
关闭转换后:

功能g(c、d、env){
返回环境a+b+c+d
}
功能f(a、b、env){
返回[g,{“a”:a,“b”:b}]
}
var[g,gEnv]=f(1,2)
var结果=g(3,4,gEnv)
来自

闭包是可以传递的自包含功能块 并在代码中使用。Swift中的闭包类似于块 在C和Objective-C中,以及在其他编程语言中使用lambdas

但这意味着什么?

这意味着闭包捕获定义它的上下文的变量和常量,称为
在这些变量和常量上闭包


我希望这有帮助

-给你一些开始的东西。闭包“关闭”打开绑定。LOL,“闭包是在打开绑定上关闭的东西。”这会不会更缺乏描述性?!?真正地真正地如果这是对我所说的或与之相关的任何内容的直接引用,你会有一个观点。这里是我链接到的:“一个lambda表达式,它的开放绑定(自由变量)已被词汇环境关闭(或绑定在词汇环境中),从而导致一个封闭表达式或闭包。”这里的“封闭”一词来自数学逻辑。。。相关概念有“表达式”、“自由变量”、“约束变量”和“闭项”。请参见例如:函数
g
包含两个自由变量:
a
b
?你刚才说自由变量是一个未在范围内定义的变量?是的,很抱歉这是一个输入错误。谢谢@NatalieCardot,在函数体
g
中,参数
a
b
既不是作为参数传入的,也不是本地定义的。这很符合Udacity的定义。解释很好,但这个例子让我困惑。我不知道正在使用什么编程语言,是否可以使用JavaScript添加类似的代码示例
funf(a,b,env)=(g,{a=a,b=b})
对我来说尤其没有意义,而且是最令人困惑的。拥有一个JS等价物将有助于简化语言的细节,并使更多的人能够访问该答案。@Vadorequest,已更新!我可以说“闭包是一个没有自由变量的函数”吗?还是不正确?根据我从你的答案中得到的信息,这可能是一个很好的定义。@Vadorequest我想说一个封闭函数是一个没有自由变量的函数。闭包是一个带有自由变量的函数,它被赋予了一个函数外部的环境,在这个环境中,这些自由变量被绑定到值上,导致函数在这些变量上关闭。谢谢!阅读也有助于我更好地理解这一点。