首页 > web前端 > js教程 > 正文

[JavaScript] 在几秒钟内理解闭包

王林
发布: 2024-08-26 21:31:35
原创
888 人浏览过

[JavaScript] Understand closures in  seconds

虽然闭包是 JavaScript 中的基本概念,但新手可能会发现它们模糊且难以掌握。具体来说,如果没有任何实际经验,ECMA 标准的定义可能很难理解。因此,我们不会在这篇文章中花很多篇幅来解释闭包的概念,而是通过使用实际代码让您轻松理解。

1. 关闭

function A(name){
    function B(){
       console.log(name);
    }
    return B;
}
var C = A("Closure");
C();//Closure
登录后复制

这是最简单的闭包。

现在我们已经了解了基础知识,让我们简要地研究一下它与典型函数的不同之处。以下是上述代码翻译成自然语言后的样子:

  1. 定义一个普通函数 A,带有参数名称
  2. 在A中定义一个正则函数B,在B中引用外部变量名
  3. 在A中返回B
  4. 执行A并将结果赋值给变量C
  5. 运行C

一条语句可以封装这五个操作:

函数A内部的函数B和变量名被函数A外部的变量C引用。

经过一点修改,该语句定义了一个闭包,如下所示:

当内部函数被外部​​函数外部的变量引用时,就形成了闭包。

因此,执行以上五个操作就定义了一个闭包。

闭包的用途

在了解闭包的用途之前,我们先来了解一下 JavaScript 的 GC(垃圾收集)机制。

在 JavaScript 中,当一个对象不再被引用时,它会被 GC 回收,否则,它会继续保留在内存中。

在上面的例子中,B 依赖于 A,因为 B 是在 A 内部定义的,而 A 被 C 间接引用,因为外部变量 C 引用了 B。

即A不会被GC回收,会继续保存在内存中。为了证明这个推理,我们稍微改进一下上面的例子。

function A(){
    var count = 0;
    function B(){
       count ++;
       console.log(count);
    }
    return B;
}
var C = A();
C();// 1
C();// 2
C();// 3
登录后复制
  1. 如果我们调用 var C = A();,A 就会被执行,创建一个计数变量和一个内部函数 B。由于 A 返回 B,所以 C 变量实际上拥有对 B 的引用。然后函数 B 可以访问计数 A 中的变量。
  2. 函数 B 可以访问 A 中的 count 变量,因为 B 是一个闭包。这是因为 B 是一个闭包,而闭包保留了创建它们的上下文(例如局部变量)。
  3. 当调用 C() 时,它实际上调用了函数 B。每次调用 C() 时,B 都会递增 count 的值并将该值显示在控制台上。
  4. A 的执行上下文在 B 创建时结束,但只要 B 引用其局部变量(例如 count),A 的局部变量就不会被回收。
  5. 只有当B不再被引用时,A中的count变量和其他局部变量才会被恢复。在这个例子中,由于C仍然引用B,所以count的值没有恢复,A的执行上下文也没有恢复。

为什么计数没有重置?

关闭机制:

  • 闭包保留 count 的状态并使其可供内部函数 B 访问。即使 A 的执行上下文终止,count 的状态仍保留在内存中,因为 B 继续引用该状态。
  • 每次调用 B:每次调用 C() 实际上都是调用 B(),它使用闭包中存储的计数,并且不会重新初始化它。

因此,如果你在模块中定义了一些变量,并且希望将这些变量保留在内存中,但又不想“污染”全局变量,则可以使用闭包来定义该模块。

以上是[JavaScript] 在几秒钟内理解闭包的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板