GXB's Blog

  • 首页
  • 学习笔记
    • C++
    • golang
    • javascript
    • python
  • 工具分享
  • 其它
Kratos
专注于用户阅读体验的响应式博客主题
  1. 首页
  2. 学习笔记
  3. javascript
  4. 正文

JavaScript闭包:理解这个核心概念的完整指南

2026年4月25日 62点热度 0人点赞 0条评论

什么是闭包?

闭包是JavaScript中最重要也最常被误解的概念之一。简单来说,闭包是一个函数以及其词法环境的组合。这个环境包含了函数定义时所能访问的所有局部变量。

更通俗地说:当一个函数能够“记住”并访问它被定义时的作用域,即使这个函数在其定义的作用域之外被调用,就形成了闭包。

一个简单的闭包例子

function outerFunction() {
  let outerVariable = '我在外部函数中';
  
  function innerFunction() {
    console.log(outerVariable); // 内部函数可以访问外部变量
  }
  
  return innerFunction;
}

const closure = outerFunction();
closure(); // 输出: '我在外部函数中'

在这个例子中,innerFunction 就是一个闭包。它“捕获”了 outerVariable,即使 outerFunction 已经执行完毕,这个变量依然存活在内存中。

闭包的原理:作用域链

要理解闭包,必须先理解JavaScript的作用域链机制:

let globalVar = '全局变量';

function outer() {
  let outerVar = '外部变量';
  
  function inner() {
    let innerVar = '内部变量';
    console.log(globalVar, outerVar, innerVar); // 可以访问所有
  }
  
  return inner;
}

当函数执行时,会按照以下顺序查找变量:

  1. 自己的作用域

  2. 外部函数的作用域

  3. 全局作用域

闭包的性能考量

虽然闭包非常有用,但需要注意:

  1. 内存占用:闭包会使外部函数的变量继续存在内存中,不会被垃圾回收

  2. 性能开销:创建闭包比普通函数需要更多内存

// 谨慎使用:不必要的闭包
function heavyClosure() {
  const largeData = new Array(1000000).fill('data');
  
  return function() {
    // 即使不使用 largeData,它也不会被回收
    console.log('hello');
  };
}

// 优化:只在需要时捕获变量
function lightClosure() {
  return function() {
    const largeData = new Array(1000000).fill('data');
    console.log(largeData[0]);
  };
}

总结

闭包是JavaScript的核心特性,它让函数可以“记住”其词法环境。理解闭包对于:

  • 编写模块化代码

  • 实现数据私有化

  • 理解异步编程

  • 优化代码设计

都至关重要。

记住:每个函数都是一个闭包,只是有些闭包比其他的更有用。掌握闭包,你就掌握了JavaScript的函数式编程精髓。

标签: 暂无
最后更新:2026年4月25日

admin

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2026 年 5 月
  • 2026 年 4 月

分类

  • C++
  • golang
  • javascript
  • python
  • 学习笔记
  • 工具分享

COPYRIGHT © 2026 GXB's Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2024198348号-6