JavaScript闭包

我们从一个新的函数开始,一个安全预订的函数;

javascript 复制代码
const secureBooking = function () {
  let passengerCount = 0;

  return function () {
    passengerCount++;
    console.log(`${passengerCount} passengers`);
  };
};

const booker = secureBooking();

下面我们将使用一个图片来看一下booker函数是如何被创建的

● 现在我们直接将booker函数调用

● 我们可以看到,乘客的数量被累加了,但是这是为什么呢?booker函数是如何记住上一次是多少顾客的呢?

这是因为 JavaScript 中的闭包(closure)的原理。在这个例子中,secureBooking 函数返回了一个内部函数,而这个内部函数引用了 secureBooking 函数作用域中的 passengerCount 变量。由于内部函数保留对外部函数作用域的引用,所以每次调用 booker 函数时,passengerCount 变量都会被更新并保留在内存中,这样就实现了记住乘客人数的累计功能。

注:

● 函数可以访问创建它的执行上下文的变量环境(VE)

● 闭包:VE附加到函数,与函数创建的时间和地点完全一致

当我们调用 secureBooking() 函数时,它会返回一个内部函数,并且这个内部函数可以访问到 secureBooking() 函数作用域中的变量。在这个例子中,passengerCount 变量就是定义在 secureBooking() 函数内部的一个变量。但由于内部函数保持了对外部函数作用域的引用,所以每次我们调用 booker() 函数时,它都可以访问并修改 passengerCount 变量的值。

换句话说,闭包是指内部函数可以记住并访问到其外部函数作用域中的变量,即使在外部函数执行完毕后仍然能够使用这些变量。因此,通过闭包,我们可以创建一种在函数外部无法直接访问的"私有"状态,比如这里的乘客人数累计,而且内部函数可以根据这个"私有"状态执行一些操作。

闭包总结

● 闭包是在其中创建函数的执行上下文的封闭变量环境,即使在该执行上下文消失之后;

● 更加通俗的说,闭包允许函数访问父函数的所有变量,即使在父函数返回后也是如此。该函数保留对其外部作用域的引用,从而在整个时间内保留作用域链。

● 闭包确保函数不会与函数诞生时存在的变量断开连接;例如,你和你的家,你就相当于一个功能,这个功能不会因为你离开了家就会与你的家断开联系,即使你离开了(函数被返回了),你仍然和你的家有关联;

● 在类比一下,一个闭包就像一个背包,一个功能随身携带,无论它走到哪里。这个背包包含创建函数的环境中存在的所有变量;

注:我们不需要手动创建闭包,这是一个JavaScript特性,它会自动发生。我们甚至不能明确地访问封闭变量。闭包不是有形的JavaScript对象。

相关推荐
桌面运维家1 天前
VLAN配置进阶:抑制广播风暴,提升网络效率
开发语言·网络·php
天天向上10241 天前
vue el-table实现拖拽排序
前端·javascript·vue.js
一轮弯弯的明月1 天前
Python基础-速通秘籍(下)
开发语言·笔记·python·学习
西西学代码1 天前
Flutter---回调函数
开发语言·javascript·flutter
大尚来也1 天前
深入HashMap底层:从JDK1.7到1.8的架构演进与性能突围
开发语言
卷帘依旧1 天前
JavaScript 闭包经典问题:为什么输出 10 次 i=10
javascript
柳杉1 天前
Three.js × Blender:从建模到 Web 3D 的完整工作流深度解析
前端·javascript·数据可视化
森林里的程序猿猿1 天前
并发设计模式
java·开发语言·jvm
222you1 天前
四个主要的函数式接口
java·开发语言
用户806138166591 天前
发布为一个 npm 包
前端·javascript