`

闭包是怎么形成的

阅读更多
犀牛书第8章第8节,详细说明了闭包的形成过程。
a function is executed in the scope in which it was defined.

When a function is invoked, a call object is created for it and placed on the scope chain. When the function exits, the call object is removed from the scope chain. When no nested functions are involved, the scope chain is the only reference to the call object. When the object is removed from the chain, there are no more references to it, and it ends up being garbage collected.

But nested functions change the picture. If a nested function is created, the definition of that function refers to the call objects because that call object is the top of the scope chain in which the function was defined. If the nested function is used only within the outer function, however, the only reference to the nested function is in the call object. When the outer function returns, the nested function refers to the call object, and the call object refers to nested function, but there are no other references to either one, and so both objects become available for garbage collection.

Things are different if you save a reference to the nested function in the global scope. You do so by using the nested function as the return value of the outer function or by storing the nested function as the property of some other object. In this case, there is an external reference to the nested function, and the nested function retains its reference to the call object of the outer function. The upshot is that the call object for that one particular invocation of the outer function continues to live, and the names and values of the function arguments and local variables persist in this object. JavaScript code cannot directly access the call object in any way, but the properties it defines are part of the scope chain for any invocation of the nested function.

-------------------------简单总结--------------------------
当嵌套函数被返回,被外部的变量引用,或者作为外部对象的属性时,形成闭包。

形成闭包之后,原本应该已经被垃圾回收的变量,都能继续使用。
分享到:
评论

相关推荐

    js闭包详细讲解

    闭包的形成基于三个关键点: 1. **函数嵌套**:一个函数被定义在另一个函数内部。 2. **返回内部函数**:外部函数返回其内部定义的函数。 3. **内部函数引用外部变量**:内部函数需要访问其外部函数的局部变量。 ...

    javascript里的闭包是什么 什么是闭包.zip

    闭包的形成发生在函数内部创建另一个函数时。这个内部函数可以访问到外部函数的变量,即使外部函数已经执行完毕。这是因为内部函数仍然保持着对外部环境的引用,形成了一个“闭合”的状态,即闭包。这种机制使得内部...

    python高阶闭包练习题

    2. **闭包与匿名函数**:Python的`lambda`表达式可以创建匿名函数,这些函数也可以形成闭包。例如,`lambda x: x + 1`是一个简单的闭包,它能够记住外部作用域的值。 3. **非局部变量**:使用`nonlocal`关键字可以...

    js闭包写法学习demo

    闭包的形成主要有三个要素:内部函数、外部函数和外部函数的作用域链。以下是一些关于JavaScript闭包的关键知识点: 1. **函数嵌套**:闭包最常见的形式是内部函数引用了外部函数的变量。例如: ```javascript ...

    离散数学的各种闭包运算

    4. **对称闭包**:对称闭包是通过添加所有可能的对称对来形成,即如果(x, y)在原关系中,那么(y, x)也加入闭包。这在图论中意味着将所有缺失的对称边添加到图中。 5. **Warshall算法**:Warshall算法是计算传递闭包...

    对于三元闭包的验证.zip

    三元闭包意味着通过中间节点,两个未直接连接的节点可以形成间接的连通关系。这种现象在社交网络中很常见,例如,A与B是朋友,B与C是朋友,即使A和C不是直接的朋友,他们通过共同的朋友B形成了社交网络中的联系。 ...

    迭代器、代码块、闭包

    在Python中,当内部函数引用了外部函数的非全局变量时,就形成了闭包。闭包常用于数据封装、延迟计算、状态保存等场景。例如,一个常见的闭包应用是高阶函数,如`map()`、`filter()`和`reduce()`,它们接收一个函数...

    闭包作用域

    闭包的形成基于两个关键概念:作用域链(Scope Chain)和执行上下文(Execution Context)。 1. **作用域链**: - 在每个函数创建时,都会构建一个作用域链,用于存储函数可以访问的所有变量和函数。 - 作用域链...

    闭包问题html

    但是,当一个函数返回另一个函数时,内部函数可以访问外部函数的变量,这就形成了闭包。 闭包的创建通常涉及以下三个要素:内部函数、对外部变量的引用以及外部函数的执行环境。例如: ```javascript function ...

    数据科学三元闭包验证

    三元闭包是指如果个体A与B有联系,B与C有联系,通常情况下,A与C之间也会形成联系。这种现象在社会学中被广泛讨论,因为它反映了人们倾向于与朋友的朋友建立关系的倾向,以增强社交网络的紧密性。 在数据验证过程中...

    JS 闭包的理解

    - **模块化**:闭包可以作为实现模块化的一种手段,每个模块内部形成一个独立的作用域。 - **延迟计算**:通过闭包,可以将计算过程延迟到需要时再执行,提高程序性能。 - **事件处理**:在事件处理函数中,闭包...

    closure闭包

    在这个例子中,`inner`函数形成了一个闭包,因为它引用了外部函数`outer`的局部变量`x`。当`outer`返回`inner`并赋值给`closure_example`时,`x`的值被保存,即使`outer`的执行已经完成。 在Java中,你可以使用...

    闭包实现ztree增删改查

    在JavaScript中,每当函数被创建时,都会形成一个闭包,可以保存函数的局部变量。因此,通过闭包,我们可以在不污染全局变量的情况下存储和管理数据。 在ZTree的上下文中,闭包可以用于以下目的: 1. 数据缓存:当...

    js闭包是什么?.pdf

    在JavaScript中,由于函数是一等公民,即函数可以作为参数传递,也可以作为值返回,这为闭包的形成提供了条件。 在给定的文档内容中,我们看到一个示例: ```javascript function a() { var i = 0; function b()...

    Swift视频教程 基础语法系列 闭包单行间接返回

    例如,如果你在循环中使用闭包,它可以捕获每次迭代中的变量值,形成所谓的“闭包循环变量”问题,这是需要注意的一个潜在陷阱。 总的来说,Swift的闭包是强大的工具,它们简化了代码并提升了功能的复用性。通过...

    javascript闭包详解

    - **闭包的特点**:当一个函数(内部函数)被另一个函数(外部函数)中的变量所引用,并且这个内部函数被外部返回或者保存时,就形成了一个闭包。 通过下面的例子可以更直观地理解闭包的定义: ```javascript ...

    js闭包理解之倒计时

    在JavaScript中,每当函数被创建时,它都会形成一个闭包,这个闭包包含了函数自身以及在其定义时所处的作用域链。当函数作为返回值或者在异步操作中被保存时,这个闭包就使得函数能够继续访问那些在它外部定义但未在...

    闭包的理解

    这里虽然涉及到了作用域的概念,但由于`$.problemWo`是在IIFE内部定义的,所以并没有形成一个真正的闭包。 #### 更深入的闭包示例 为了更好地理解闭包,我们来看另一个示例: ```javascript (function($) { $....

Global site tag (gtag.js) - Google Analytics