你真的懂闭包么?

简介: 前言本文主要总结一下 到目前为止对闭包的理解.好几年之前学习闭包的时候模模糊糊,看了网上的一些帖子,理解为:函数内部可以使用函数外部的变量,后面看了你所不知道的JS,以为自己懂了,后面面试的时候又感觉自己不懂了,而今感觉自己真正懂了==,特此记录一下。

前言


本文主要总结一下 到目前为止对闭包的理解.

好几年之前学习闭包的时候模模糊糊,看了网上的一些帖子,理解为:函数内部可以使用函数外部的变量,后面看了你所不知道的JS,以为自己懂了,后面面试的时候又感觉自己不懂了,而今感觉自己真正懂了==,特此记录一下。


闭包的几个要点


MDN中是这样定义的:

闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。

有点懵逼😳是吧,我来拆解为三个要点(这三个要点为重点!!!):

  • 要点1:由 一个函数 以及 其定义时所在封闭环境内的各种资源(引用)构成 的组合称为闭包
  • 要点2:函数作为返回值时,闭包一般是通过 return 把局部定义的函数"带"出去,每次"带"出去的函数都是新的函数(就是说每次返回的函数都是不一样的!!!)
  • 要点3:使用闭包后,里面的变量不会马上销毁,会一直存在栈中。


实战

对于要点1的理解,看下面这个例子

//函数作为返回值
//eg1:
function test() {
  const a = 1;
  returnfunction () {//这里的匿名函数和上面的a捆绑在一起构成了一个闭包
    console.log('a:', a);
  }
}
const fn = test();
const a = 2;
fn()//a: 1

请注意函数定义的位置!再看例2:

//函数作为参数
//eg2
function test1(fn1) {
  const b = 1;
  fn1();
}
const b = 2;
function fn1() {//这里的fn1和上面的b构成了一个闭包
  console.log('b:', b);
}
test1(fn1)//b: 2

由例1和例2可以知道,MDN中定义中的“及其捆绑的周边环境状态”中的“其”指的就是函数定义的地方;

对于要点2的理解,看下面这个例子

函数是一个静态代码块,那么多次调用外层函数返回出来的闭包函数,是同一个吗?来看看:

function test() {
    function closure() { }
    return closure;
}
const a = test();
const b = test();
console.log(a === b);   // false

意不意外,惊不惊喜??

为什么呢?

如果不能理解,看下面一行代码:

function test() {
    const a = function () { };
    const b = function () { };
    console.log(a === b);   // false
}

可以理解了么:每一次 function 都定义了一个新的函数。举个例子,一个学校里面有五个小明,但是这五个人是长相不一样的人。

对于要点3的理解,看下面这个例子

function test5() {
  var num = 0;    //s1
  function add() {//s2
    console.log(++num)
  }
  return add;
}
var add = test5();
console.log(add());//1 undefined
console.log(add());//2 undefined
console.log(add());//3 undefined
console.log(add());//4 undefined
console.log(add());//5 undefined

这里的s1处的num和s2处的add构成了闭包,并且在add执行的过程中,num并没有释放,而是一直存在栈中!


结束

再重复一遍闭包:

  • 由 一个函数 以及 其定义时所在封闭环境内的各种资源(引用)构成 的组合称为闭包
  • 函数作为返回值时,闭包一般是通过 return 把局部定义的函数"带"出去,每次"带"出去的函数都是新的函数
  • 使用闭包后,里面的变量不会马上销毁,会一直存在栈中。
目录
相关文章
Navicate如何全部选中表,点击表,然后移动到右侧,右侧可以选中,实现拖拽
Navicate如何全部选中表,点击表,然后移动到右侧,右侧可以选中,实现拖拽
|
27天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
36039 142
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
9天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
4078 30
|
22天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7970 22
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
21天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
5395 12
|
5天前
|
存储 人工智能 负载均衡
阿里云OpenClaw多Agent实战宝典:从极速部署到AI团队搭建,一个人=一支高效军团
在AI自动化时代,单一Agent的“全能模式”早已无法满足复杂任务需求——记忆臃肿导致响应迟缓、上下文污染引发逻辑冲突、无关信息加载造成Token浪费,这些痛点让OpenClaw的潜力大打折扣。而多Agent架构的出现,彻底改变了这一现状:通过“单Gateway+多分身”模式,让一个Bot在不同场景下切换独立“大脑”,如同组建一支分工明确的AI团队,实现创意、写作、编码、数据分析等任务的高效协同。
946 21