关闭的正式定义是什么?并取决于编程语言吗?

时间:2019-04-30 14:02:34

标签: typescript functional-programming closures

据我的教授说,闭包是函数式编程语言中函数的价值。但是当我用Google搜索它时,我看到了另一个定义:

  

闭包是即使父函数已关闭,也可以访问父作用域的函数。

哪个是正确的?

1 个答案:

答案 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将变量ijk的值相加。变量j是一个函数参数,变量k是一个在函数体内定义的局部变量。但是变量i来自“外部”,称为 free变量

闭包是“关闭”一个或多个自由变量的任何函数。一旦函数完成,就不再需要局部变量和函数参数,这意味着可以弹出函数保留其变量的整个堆栈框架。但是拥有一个自由变量意味着堆栈帧需要保存在RAM中以备将来使用。

在某些语言中,更改free变量的值不会影响相应闭包的本地记忆状态,而在其他语言中,更改是可见的。使用先前的ifoo

// 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

我不知道您的老师所说的“函数值”是什么意思。在函数式编程中,函数被称为“一等公民”,这意味着每个函数都是一个值(可以将其视为函数参数,从函数返回,保留在集合中等)。