据我的教授说,闭包是函数式编程语言中函数的价值。但是当我用Google搜索它时,我看到了另一个定义:
闭包是即使父函数已关闭,也可以访问父作用域的函数。
哪个是正确的?
答案 0 :(得分:0)
您在网上找到的定义是正确的。
这是一些伪代码:
i = 1
def foo(j: Int) = {
k = 2
return i + j + k
}
foo(42) // returns 43; value of "i" is preserved inside the function
函数foo
将变量i
,j
和k
的值相加。变量j
是一个函数参数,变量k
是一个在函数体内定义的局部变量。但是变量i
来自“外部”,称为 free变量。
闭包是“关闭”一个或多个自由变量的任何函数。一旦函数完成,就不再需要局部变量和函数参数,这意味着可以弹出函数保留其变量的整个堆栈框架。但是拥有一个自由变量意味着堆栈帧需要保存在RAM中以备将来使用。
在某些语言中,更改free变量的值不会影响相应闭包的本地记忆状态,而在其他语言中,更改是可见的。使用先前的i
和foo
:
// some languages, e.g. Javascript:
foo(42) // 43
i = 2
foo(42) // 43
// other languages, e.g. Scala:
foo(42) // 43
i = 2
foo(42) // 44
我不知道您的老师所说的“函数值”是什么意思。在函数式编程中,函数被称为“一等公民”,这意味着每个函数都是一个值(可以将其视为函数参数,从函数返回,保留在集合中等)。