了解 JavaScript 中的闭包

介绍

在本文中,您将涵盖关闭是什么以及为什么JavaScript从关闭中受益的基本知识。

前提条件

如果您想跟随这篇文章,您将需要:

• 熟悉 JavaScript 变量、函数、范围和回复

定义关闭

语言如JavaScript和Ruby支持关闭,这允许变量即使在其编程块已执行后也能够引用其母范围,只要这些变量在某个地方有引用,关闭就存在。

考虑下面的关闭例子:

1function outerFunction() {
2 let delayed = veryLongOperation();
3
4 let innerFunction = function() { someCallback(delayed); }
5}

innerFunction是一个能够访问其母范围元素的函数,例如延迟对象。

使用关闭

现在我们已经看到关闭是什么,为什么它们是有用的?

在执行时,JavaScript可以是无同步的。完成操作时,必须使用调用回复。这个调用回复现在必须运行与其调用者/家长相同的执行背景。这意味着任何可用变量或功能都必须现在可用于调用回复。如果这些调用回复没有关闭,那么我们就必须手动绑定所需的范围成员。

关闭使我们的生活变得更容易,通过在背景中为我们处理这一点,如果一个函数内部有一个函数,内部函数在其整个生命周期中可以访问其范围成员。

以下是类定义的例子:

1let classExample = function () {
2  let randomNumber = Math.floor(Math.random() * 10);
3
4  return function() {
5    console.log(randomNumber);
6  }
7}

内部函数的范围链被扩展到包括classExample函数的成员。

另一个关闭发生的例子是库里制作期间。库里制作是返回多个函数以减少精度的过程。

可以使用关闭,加上加里来介绍JavaScript课程的私人会员。

1function curryingExample() {
2  let message = "Hello.";
3
4  return {
5    getMessage: function() { console.log('private message', message); }
6  };
7}

创建一个新的curryExample()实例:

1let curry = new curryingExample();

尝试访问消息:

1console.log('undefined message', curry.message);

當「console.log(curry.message);」執行時,該值將是「未定義」。

尝试使用getMessage():

1curry.getMessage();

當「curry.getMessage();」執行時,值將為「Hello」。

结论

关闭是JavaScript的一个非常微妙但强大的功能,理解它们是成为一个严肃的JavaScript开发人员的道路上非常重要的一步。

这在Kyle Simpson的(https://twitter.com/getify)优秀的写作中更详细地解释了(https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/scope-closures/ch7.md)。

Published At
Categories with 技术
Tagged with
comments powered by Disqus