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

相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端