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对象。

相关推荐
Edward.W17 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer17 小时前
Python字符串
开发语言·数据库·python
月疯18 小时前
各种信号的模拟(ECG信号、质谱图、EEG信号),方便U-net训练
开发语言·python
荒诞硬汉18 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国18 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
flysh0518 小时前
C# 架构设计:接口 vs 抽象类的深度选型指南
开发语言·c#
2501_9418824818 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
bkspiderx18 小时前
C++中的volatile:从原理到实践的全面解析
开发语言·c++·volatile
han_18 小时前
从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序
前端·javascript·面试
沛沛老爹19 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理