闭包可以看作是一个具有两部分的数据结构:一部分是代码(也就是闭包的函数体),另一部分是环境,即闭包捕获的变量和常量。
-
代码:闭包的函数体是一系列指令,它们被存储在内存中的一块区域。这个区域通常是只读的,表示这些指令不能被修改。当闭包被调用时,CPU 会读取并执行这些指令。
-
环境:闭包捕获的变量和常量被存储在一个称为"环境"的数据结构中。每个捕获的变量或常量都被存储为一个键值对:键是变量或常量的名称,值是变量或常量的当前值。这个环境被存储在一块可以读写的内存区域,表示捕获的变量的值可以被修改。
当一个闭包被创建时,环境会被填充捕获的变量和常量的当前值。然后,每次闭包被调用时,这个环境都会被用来设置这些变量和常量的值。
这种方式使得闭包能够"记住"捕获的变量和常量的值,即使闭包在其定义的作用域之外被调用。然而,这也可能导致闭包和类实例之间的引用循环,因为闭包可能会捕获并持有类实例的强引用。
因此,在使用闭包时,需要特别注意是否会导致引用循环,从而导致内存泄漏。可以使用捕获列表来避免这种循环引用。