闭包-JavaScript概念

这是该系列文章的一部分,我将尝试通过33个JS概念中的每一个进行解释。

最初写在我的博客上并带有互动示例

这部分对应于关闭。

关闭

JavaScript是一种将函数视为一等公民的语言。这是功能语言的一部分。函数只是JavaScript中的对象,可以将它们分配给变量,将其传递给函数或从函数本身返回。

让我们一一看一下这些情况:

1.分配给变量

const foo = function(a) {
  return a++;
};

在此功能被分配给变量 foo,要调用此函数,我们需要调用 foo()foo 这里是对该函数的引用,可以重新分配或分配给其他变量。

2.将它们传递给函数

我们刚刚看到可以将函数分配给变量。从本质上讲,这是一个简单的副产品。您可以像处理其他任何对象一样传递这些引用。

function inc(num) {
  return num+1;
}
function counter(num, incFun) {
  return incFun(num);
}
let number = 1;
number = counter(number, inc);
console.log(number);
// What happens on decrement action?

在这里,您可以看到 inc 被传递到 counter 函数依次调用它。您可能想知道为什么我们必须采用这种方法,而不仅仅是打电话 inc 直接来自 counter。所不同的是,现在我们可以控制 counter 从外面增加。也就是说,我们可以传递另一个以2和Boom递增的函数我们有一个计数器,该计数器的乘积是2而不是1。我们可以这样做,而根本不改变函数。

写时我们不调用它 inc,仅在将括号连接到它时才增加。

3.返回功能

这将比其他的更长,但是请在这里忍受。

在最后一个示例中,我们讨论了如何更改 counter 通过传递不同的功能来实现功能。让我们看一下如何实现该结果:

function inc(num) {
  return num+1;
}
function incBy2(num) {
  return num+2;
}
function counter(num, incFun) {
  return incFun(num);
}
let number = 1;
number = counter(number, inc);
console.log(number);
number = counter(number, incBy2);
console.log(number);

我们刚刚创建了两个函数: incincBy2。第一个函数增加1,第二个函数增加2。但是我想我们可以同意这不是最优雅的方法。如果必须创建一个加3的函数,则需要第三个函数。我们如何为此目的创建一个功能?

让我们首先看看最简单的方法:

function inc(num, factor) {
  return num+factor;
}
function counter(num, factor, incFun) {
  return incFun(num, factor);
}
let number = 1;
number = counter(number, 1, inc);
console.log(number);
number = counter(number, 2, inc);
console.log(number);

好吧,这可以完成工作。但这违反了我们为自己设定的期望。将功能传递给的整个目标 counter 事实是 counter 不需要知道正在增加的因素或正在执行的任何操作。通过传递 factor 进入 counter,我们已经破坏了这种封装。我们需要更好的方法来创建可以传递给我们的动态功能 counter

function createInc(factor) {
  return function(num) {
    return num + factor;
  }
}
function counter(num, incFun) {
  return incFun(num);
}
let number = 1;
number = counter(number, createInc(1));
console.log(number);
number = counter(number, createInc(2));
console.log(number);

如果您觉得这很自然,那么恭喜 successfully您已成功了解闭包。如果无法继续阅读:

createInc 是一个返回函数的函数,让它同步;返回函数的函数。

这里我们要关注的是变量 factor 传入。如果您看一下该程序的调用堆栈,可以看到 createInc 将添加到堆栈中,并在返回其内部函数后立即弹出。但是返回的函数仍在使用 factor 在运行时。那怎么保留呢?

创建函数时,该函数既存储其本地函数,又存储创建函数的上下文。此上下文称为闭包环境。一个函数在创建时会存储局部变量和创建该函数的闭包范围。仅当函数本身被收集时,此闭包范围才被垃圾回收。这是函数的部分执行上下文。

这会改变我编写代码的方式吗?

好吧,应该。范围和闭包是语言最重要的基石。它可以而且应该影响您对语言和声明的思考方式。

有什么我想念的吗?有问题?好东西?在Twitter上ping我

资讯来源:由0x资讯编译自DEV,原文:https://dev.to/boywithsilverwings/closures-javascript-concepts-2bce ,版权归作者所有,未经许可,不得转载
你可能还喜欢