通过示例了解 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 版权协议,转载请附上原文出处链接和本声明