闭包

概念

闭包 是能访问其自身函数作用域外变量的函数

本质 = 函数 + 其词法环境

例子

🌰1(全局环境闭包):
js 复制代码
let a = 7;

function sum(b){
  return a + b
}

const sixSum = sum(6)
console.log(sixSum)

在定义 sum 时,JS引擎将其与当前词法环境(含 a )绑定为闭包 即

css 复制代码
闭包 = {
  函数: sum (...) { ... }, // 函数本身
  环境: { // 精确捕获的被引用变量
    a: 7,
  }
}
🌰2(嵌套函数闭包):
js 复制代码
function outer(){
    let a = 7
    return function inner(){
        a++
        console.log(a);
    }
}

let outerOne = outer()

outerOne()

在定义 sum 时,JS引擎将其与当前词法环境(含 a )绑定为闭包 即

css 复制代码
闭包 = {
  函数: inner (...) { ... }, // 函数本身
  环境: { // 精确捕获的被引用变量
    a: 7,
  }
}
  • 闭包仅保存被引用的变量a),不会保存整个函数体
  • 每次调用 outer() 创建独立闭包环境

实际应用场景

① 封装私有变量

javascript 复制代码
function createCounter() {
  let count = 0; // 私有变量
  return {
    increment: () => { count++; },
    getValue: () => count
  };
}
const counter = createCounter();
counter.increment();
console.log(counter.getValue()); // 1
// 无法直接访问 count,只能通过闭包暴露的方法操作

② 模块化开发(IIFE模式)

javascript 复制代码
const module = (() => {
  let privateVar = 'secret';
  const privateMethod = () => console.log(privateVar);
  return { publicMethod: privateMethod };
})();
module.publicMethod(); // 输出 "secret"

③ 回调函数与事件处理

javascript 复制代码
function setupClickHandler(buttonId) {
  const button = document.getElementById(buttonId);
  let clickCount = 0;
  button.addEventListener('click', () => {
    clickCount++;
    console.log(`按钮点击次数:${clickCount}`);
  });
}
// 即使 setupClickHandler 执行完毕,回调函数仍能通过闭包访问 clickCount

④ 函数工厂(参数预置)

javascript 复制代码
function createMultiplier(x) {
  return function(y) { // 闭包记忆x的值
   return x * y 
  }
}
const double = createMultiplier(2);
console.log(double(5)); // 10  x=2通过闭包保存
相关推荐
成都渲染101云渲染66663 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
SRET7 小时前
Mineradio 沙盒隔离安装完全指南 | 一键安全运行 Electron 应用!!!
javascript·经验分享·安全·electron·aigc·音视频·ai编程
全栈前端老曹7 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
free3510 小时前
作用域链与 Environment:变量查找、遮蔽和赋值怎么实现
javascript
YHL10 小时前
🤖 Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·javascript·人工智能
HUMHSX12 小时前
Vue 组件通信核心知识点梳理
javascript·vue.js·ecmascript
风止何安啊12 小时前
🚦 前端并发请求 “交通管制”:别让你的接口堵成早高峰
前端·javascript·面试
熊猫钓鱼>_>12 小时前
2026 前端的三场底层革命:当 Vue、React Native 和 Three.js 同时去掉中间层
前端·javascript·vue.js·react native·架构·webgl·three.js
名字还没想好☜13 小时前
React useEffect 依赖数组踩坑:闭包陷阱与清理函数
前端·javascript·react.js·react·useeffect
柒和远方14 小时前
LeetCode 4. 寻找两个正序数组的中位数 —— 二分划分的艺术
javascript·python·算法