“闭包”是什么?

537

我问了一个关于柯里化的问题,提到了闭包。什么是闭包?它与柯里化有什么关系?


33
闭包是什么?有些回答说,闭包是函数;有些说它是堆栈;还有些回答称其为“隐藏”的值。据我理解,它是由函数和封闭变量组成的。 - Roland
5
闭包是一种函数,它可以捕获并存储其被创建时所在环境的状态信息,并在其词法范围之外被调用。 闭包通常用于实现数据隐藏和封装,以及在JavaScript中创建模块或命名空间。 它们是JavaScript中强大且常见的编程概念之一。 关于为什么称其为“闭包”,这可能是因为它可以“封闭”或包含其被创建时的环境。 - dietbuddha
2
请参考软件工程领域 stackexchange 上的 什么是闭包? - Felix K.
这里有很棒的答案。然而,如果你对数学有兴趣,值得查看 https://dev59.com/1nVC5IYBdhLWcg3wqzDV#36878651。 - KGhatak
22个回答

0
闭包很容易。我们可以将其视为以下内容: 闭包 = 函数 + 其词法环境
考虑下面的函数:
function init() {
    var name = “Mozilla”;
}

在上述情况下,闭包将是什么? 函数init()及其词法环境中的变量,即name。 闭包 = init() + name 考虑另一个函数:
function init() {
    var name = “Mozilla”;
    function displayName(){
        alert(name);
}
displayName();
}

这里会有什么闭包? 内部函数可以访问外部函数的变量。displayName() 可以访问在父函数 init() 中声明的变量 name。然而,如果存在相同的局部变量,则 displayName() 中将使用它们。
闭包 1:init 函数 +(name 变量 + displayName() 函数)--> 词法作用域
闭包 2:displayName 函数 +(name 变量)--> 词法作用域

0

以下是一个Groovy的简单示例,仅供参考:

def outer() {
    def x = 1
    return { -> println(x)} // inner
}
def innerObj = outer()
innerObj() // prints 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接