通过示例了解 JS 中的闭包

通过示例了解 JS 中的闭包

Photo by 克里斯·阿瑟-柯林斯 on 不飞溅

如果你像我一样,很可能你已经尝试理解 关闭 在您的 Javascript 研究中的某个时间点。再说一次,如果你像我一样,你不得不多次回到这个概念,因为你已经忘记了一切。这是完全正常的,因为 关闭 它非常抽象,需要一些精神上的努力才能达到足够的理解水平。在这篇简短的文章中,我将使用一些非常基本的示例来说明 关闭 .此外,我将向您展示为什么在编写 Javascript 代码时它很重要。

通过阅读该系列的第二本书,可以更好地理解我要在这里写的大部分内容。 你不懂JS (范围和闭包)de 凯尔辛普森 .这是很棒的材料,你应该把它作为你学习的伴侣。

另一个重要的细节是我将选择一些英文术语,因为在开发人员中使用它们更为常见。前任: 闭门造车 而不是 关闭 .

什么是闭包?

首先,让我们从一个精确的定义开始 闭门造车 .

当一个函数使用来自外部作用域的变量时,就会看到闭包效应,即使该函数是在通常无法访问该变量的作用域中执行的。

这个定义的主要注意点是:

  • 必须有一个功能
  • 必须从外部范围引用至少一个变量
  • 必须从变量作用域链的不同分支调用 关闭

让我们看看我们的第一个例子,最经典的。

经典的例子

看下面的代码:

在上述情况下,我们说函数 some10com() 它有 关闭 变量 数字1 .变量 数字1 , 属于函数范围 求和器() .返回的匿名函数 求和器() , 在其内部范围内使用变量 数字1 .当我们将此匿名函数的引用关联到变量时 some10com ,我们实际上是在创建这个函数的一个实例,它反过来将变量的引用存储在内存中 数字1 .在最后一行,当我们调用这个实例时,它通常无法访问变量 数字1 ,给定它的词汇位置,因为 数字1 是作用域链的下一层。然而,通过 关闭 ,该角色保留该访问权。此外, 数字1 保存在内存中,不经过 国标 ( 垃圾收集 ) 只要它对某些调用有用。

这种效果非常强大,并且允许在 编程作品 读一些 设计模式 .

重要的是要记住,使用闭包,函数会保留变量的引用,而不是其值。如果在任何情况下,此变量更改其值,该函数将使用新值。

关闭 em 回调

的效果 关闭 被广泛用于 回调 .让我们看看下面的调用示例 阿贾克斯

功能 阿贾克斯() ,当它收到响应时,它将调用声明为第二个参数的函数并将该响应作为参数传递(在参数中 登记 )。没时间 日志() 被调用,函数 fetchDoAlunoRecord() 已完成执行。即使是这样, 日志() 仍然可以访问变量 idDoAluno , 通过 关闭 .

事件处理程序

闭包 也常见于 事件处理程序 .我们来分析下面的代码:

在这种情况下,函数 等待点击次数() 添加一个 听众 类型事件 ' 点击 ' 至 按钮购买 并花一个 打回来 作为第二个论点。功能 点击() 引用变量 名称DoBotao 并且,当它被调用时,即使在执行之后 agurandandoCliques() , 仍然可以访问此变量。再说一次,这通常是不可能的。这怎么可能? 关闭 .

您可能已经注意到, 关闭 在运行时改变变量的正常生命周期流程。在执行函数时创建的作用域通常是关闭的,并且 垃圾收集 解释后 返回 或者 } , 例如。和 关闭 ,这些变量保留在内存中。这样做的结果是,我们在编写代码时必须坚持这个细节,尤其是当变量受到影响时 关闭 持有对大型数据结构的引用(例如 大批 长)。因此,当我们定义一个 关闭 对于这种类型,作为一种好的做法,我们应该确保一旦不再需要此引用,就立即清理它。因此,我们避免 资源浪费 e 无意的数据暴露 .

让我们看一个如何处理这种情况的示例:

在上面的例子中,变量 CliqueHandlers 不排除因 关闭 .然而,它将 大批 空的,它曾经拥有的任何价值,无论多么伟大,都将是 垃圾收集 .

咖喱

效果的另一种重复应用 关闭咖喱 和部分应用,广泛用于 函数式编程 .看下面的例子:

我们在上面观察到的是 定义处理程序() 是创建引用的部分应用程序 urlDoRequest e 请求数据 通话所需 阿贾克斯 .所以我们可以创建 处理程序 使用第二个函数更容易,只传递一个参数,提高了代码的可读性。当事件触发时,作为参数传递给 打回来 处理程序() 是点击事件本身(未使用)。尽管如此,此回调仍保留用于调用该函数的 URL 和数据引用。 阿贾克斯() .这是可能的,这要归功于 关闭 .

结论

我们已经到了文章的结尾。如果您仍然感到困惑,请不要担心。并非所有编程概念都易于或快速理解。慢慢来。重读。在您喜欢的 IDE 中编写代码并在 ' 调试模式' .不要急于学习。这些基础知识对于您作为开发人员的旅程很重要。每当你觉得你的知识结构被削弱时,建立一个坚实的基础并回归基础。要有耐心,尊重你的节奏。

现在,如果在读完这篇文章后,你认为你终于理解了 关闭 , 生日快乐!这种效果非常重要,并被广泛用于构建更高效、可重用和可读的代码。

如果您发现我的解释中有任何缺陷,请发表评论。如果它是一个富有成效的阅读,留下你的感谢。

好学。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/36334/46501410

posted @ 2022-09-14 10:47  哈哈哈来了啊啊啊  阅读(6)  评论(0编辑  收藏  举报