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

相关推荐
Bug收容所2 分钟前
Vue+js Day2
前端·javascript·vue.js
初心未改HD4 分钟前
DSH Skill开发实战:SKILL.md是给LLM看的操作手册,不是给人看的README,踩了4个坑
java·大数据·开发语言
Wang's Blog22 分钟前
Java 项目实战: 交友项目 - SpringData-Mongo 环境搭建和 CRUD
java·开发语言·交友
掘金酱40 分钟前
带着作品来,坐下来聊|掘金 X-lab · Coffee Talk 邀请你来见一面
前端·javascript·后端
凯瑟琳.奥古斯特1 小时前
动态调优IoU提升OCR文本合并精度
开发语言·python·算法
陌陌龙1 小时前
【紧急预警!PHP 核弹级漏洞 php2shell】
开发语言·php
白露与泡影1 小时前
一线 Java 后端面试八股(2026 更新版,含完整答案)
java·开发语言·面试
企业解惑小能手-域智盾系统1 小时前
内网监控软件策略不生效、日志缺失?一套从现象到根因的排查框架
开发语言·php·域智盾
1024奇点1 小时前
【仓颉语言入门 · 第二篇 第 10 课】
开发语言·数据库·ide·mysql·开源
布莱克6051 小时前
A* 算法详解:从原理到实现
开发语言·c++·算法