JavaScript 闭包是什么?简单到看完就理解!

理解 JavaScript 闭包

在讲闭包之前,先要知道,什么是闭包?

闭包是 JavaScript 的一个基本概念即使外部函数已经执行完毕,内部函数仍然可以访问其外部(闭包)函数的变量。简单来说,闭包允许函数"记住"并访问其外部作用域中的变量,即使该函数在不同作用域中执行。

闭包的三个作用域

JavaScript 中的每个闭包都可以访问三个作用域:
  • 它自己的范围(函数内部定义的变量)
  • 外部函数的变量(来自其父函数的变量)
  • 全局变量(整个应用程序可用的变量)

变量作用域:基础

让我们通过一个基本的例子来理解变量作用域:

javascript 复制代码
function init() {
  var name = "Mozilla"; // local variable created by init
  function displayName() {
    // inner function
    console.log(name); // uses variable declared in parent function
  }
  displayName();
}
init();

在此示例中:

  • init() 函数创建一个局部变量 name 和一个内部函数 displayName()
  • displayName() 是一个内部函数,仅存在于 init() 中
  • displayName() 没有自己的局部变量
  • 由于变量作用域,它可以访问其父作用域中的变量,包括名称

理解闭包的实际作用

让我们看一个稍微修改过的、演示闭包的版本:

javascript 复制代码
function makeFunc() {
  const name = "Mozilla";
  function displayName() {
    console.log(name);
  }
  return displayName;
}

const myFunc = makeFunc();
myFunc();
要理解的关键点:
  • 这看起来与前面的示例类似,但有一个关键的区别
  • 我们不会立即执行内部函数,而是返回它
  • 即使 makeFunc() 已经执行完毕,myFunc 仍然可以访问 name 变量
  • 这是可能的,因为该函数维护对其变量环境的引用

实例:函数工厂

下面是一个更实际的例子,展示了闭包的威力:

javascript 复制代码
function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
const add10 = makeAdder(10);

console.log(add5(2));  // outputs 7
console.log(add10(2)); // outputs 12
让我们分析一下上述函数发生了什么:
  • makeAdder 是一个函数工厂 - 它创建定制函数
  • 它创建的每个函数都会记住传递给 makeAdder 的 x 的值
  • add5 和 add10 都是闭包:
    • 它们共享相同的函数定义,但它们具有不同的变量环境。
    • add5 的环境中,x 是 5。
    • add10 的环境中,x 是 10。

为什么闭包很重要

闭包非常强大,因为它允许:
  • 数据隐私:闭包内的变量保持私有,不能从外部访问
  • 状态保存:它们可以在函数调用之间保持状态
  • 函数工厂:你可以创建具有预设参数的专用函数
  • 模块模式:它们是 JavaScript 中模块模式的基础

写在最后

对于 JavaScript 开发者来说,理解闭包至关重要,因为闭包在现代 JavaScript 模式、框架和库中被广泛使用。闭包提供了一种在函数式编程中创建私有变量和维护状态的方法,使代码保持简洁且易于维护。

请记住:闭包不仅仅是嵌套在另一个函数中的函数。它是一个能够访问外部作用域变量的函数,并且即使外部函数已执行完毕,仍能持续访问这些变量。

相关推荐
Odoo老杨2 分钟前
Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享
javascript·odoo·数字化转型·erp·企业信息化
SomeB1oody4 分钟前
【Rust自学】5.1. 定义并实例化struct
开发语言·后端·rust
Kika写代码11 分钟前
【微信小程序】2|轮播图 | 我的咖啡店-综合实训
前端·微信小程序·小程序
red润18 分钟前
使用 HTML5 Canvas 实现动态蜈蚣动画
前端·html·html5
sg_knight25 分钟前
VSCode如何修改默认扩展路径和用户文件夹目录到D盘
前端·ide·vscode·编辑器·web
云空26 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
一个处女座的程序猿O(∩_∩)O35 分钟前
完成第一个 Vue3.2 项目后,这是我的技术总结
前端·vue.js
mubeibeinv35 分钟前
项目搭建+图片(添加+图片)
java·服务器·前端
青莳吖37 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
逆旅行天涯42 分钟前
【Threejs】从零开始(六)--GUI调试开发3D效果
前端·javascript·3d