从js闭包谈到作用域、作用域链、执行上下文、内存管理

发布时间:2026/8/10 22:47:38

从js闭包谈到作用域、作用域链、执行上下文、内存管理
文章目录作用域函数作用域和全局作用域块级作用域和暂时性死区执行上下文和调用栈代码执行的两个阶段调用栈闭包内存管理内存泄漏场景举例浏览器垃圾回收如何避免内存泄漏如何利用闭包实现单例模式✍创作者:全栈弄潮儿🏡 个人主页: 全栈弄潮儿的个人主页🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区📙 专栏地址,欢迎订阅:前端架构师之路闭包是 JavaScript 中最基本也是最重要的概念之一。可是闭包又绝对不是一个单一的概念: 它涉及作用域、作用域链、执行上下文、内存管理等多重知识点。作用域作用域其实就是一套规则:这个规则用于确定在特定场景下如何查找变量 。任何语言都有作用域的概念,同一种语言在演进过程中也会不断完善其作用域规则。比如,在 JavaScript 中,ES6 出现之前只有函数作用域和全局作用域之分。函数作用域和全局作用域大家应该非常熟悉函数作用域:function foo() { var a = 'bar' console.log(a) } foo()执行 foo 函数时,变量 a 在函数 foo 作用域内,函数体内可以正常访问,并输出 bar。而当:var b = 'bar' function foo() { console.log(b) } foo()执行这段代码时,foo 函数在自身函数作用域内并未查找到 b 变量,但是它会继续向外扩大查找范围,因此可以在 全局作用域 中找到变量 b,输出 bar。如果我们稍加改动:function bar() { var b = 'bar' } function foo() { console.log(b) } foo()执行这段代码时,foo 和 bar 分属于两个彼此独立的函数作用域 ,foo 函数无法访问 bar 函数中定义的变量 b,且其作用域链内(上层全局作用域中)也不存在相应的变量,因此报错:Uncaught ReferenceError: b is not defined。总结 :在 JavaScript 执行一段函数时,遇见变量读取其值,这时候会“就近”先在函数内部找该变量的声明或者赋值情况。这里可能会涉及“变量声明方式”以及“变量提升”。如果在函数内无法找到该变量,就要跳出函数作用域,到更上层作用域中查找。这里的“更上层作用域”可能也是一个函数作用域,例如:function bar() { var b = 'bar' function foo() { console.log(b) } foo() } bar()在 foo 函数执行时,对于变量 b 的声明或读值情况是在其上层函数 bar 作用域中获取的。同时“更上层作用域”也可以顺着作用域范围向外扩散,一直找到全局作用域:var b = 'bar' function bar() { function foo() { console.log(b) } foo() } bar()我们看到,变量作用域的查找是一个扩散过程,就像各个环节相扣的链条,逐次递进,这就是作用域链说法的由来。块级作用域和暂时性死区作用域概念不断演进,ES6 增加了 let 和 const 声明变量的块级作用域,使得 JavaScript 中作用域范围更加丰富。块级作用域,顾名思义,作用域范围限制在代码块中,这个概念在其他语言里也普遍存在。当然这些新特性的添加,也增加了一定的复杂度,带来了新的概念,比如 暂时性死区 。暂时性死区,还需要从“变量提升”说起,参看以下代码:function foo() { console.log(bar) var bar = 3 } foo()会输出:undefined,原因是变量 bar 在函数内进行了提升。相当于:function foo() { var bar console.log(bar) bar = 3 } foo()但在使用 let 声明时:function foo() { console.log(bar) let bar = 3 } foo()会报错:Uncaught ReferenceError: bar is not defined。我们知道使用 let 或 const 声明变量,会针对这个变量形成一个封闭的块级作用域, 在这个块级作用域当中,如果在声明变量前访问该变量,就会报referenceError 错误 ;如果在声明变量后访问,则可以正常获取变量值:

相关新闻

React 现代化 Web 应用开发:本地环境怎样一次跑通

React 现代化 Web 应用开发:本地环境怎样一次跑通

2026/8/10 22:47:38

React 现代化 Web 应用开发:本地环境怎样一次跑通 新人入职或者接手新项目,第一步往往是拉取代码跑 pnpm install && pnpm dev。但现实通常很残酷:控制台一堆红色报错、Native C 模块(如 sharp、canvas)编译失…

【单片机毕业设计推荐】基于 STM32 单片机的智能饮水设备控制系统设计与实现,基于 STM32 与 ESP‑01S 的物联网饮水监控系统设计(012106)

【单片机毕业设计推荐】基于 STM32 单片机的智能饮水设备控制系统设计与实现,基于 STM32 与 ESP‑01S 的物联网饮水监控系统设计(012106)

2026/8/10 22:47:38

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能基础功能核心功能辅助功能技术路线项目演示关于我们项目案例源码获取温馨提示:本人主页置顶文章(点我)有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶…

gh_mirrors/clas/classifier性能优化指南:让文本分类速度提升300%

gh_mirrors/clas/classifier性能优化指南:让文本分类速度提升300%

2026/8/10 22:37:37

gh_mirrors/clas/classifier性能优化指南:让文本分类速度提升300% 【免费下载链接】classifier A general classifier module to allow Bayesian and LSI classifications. 项目地址: https://gitcode.com/gh_mirrors/clas/classifier gh_mirrors/clas/class…

系统集成环境下数据库性能测试初步方案

系统集成环境下数据库性能测试初步方案

2026/8/11 0:47:42

一 测试工具和方法通过性能测试工具,进行自动化测试。初步选定Loadrunner11作为本项目的性能测试工具。二 性能测试前期准备2.1 数据准备给系统录入足够的数据量,到底多少是根据模块有所不同的。一般应至少达到10~20条。10~20条记录测试时并不能反映系统…

【 Seedance 2.5创意玩法技术解析】长视频生成如何从演示走向可控生产

【 Seedance 2.5创意玩法技术解析】长视频生成如何从演示走向可控生产

2026/8/11 0:47:42

文章目录Seedance 2.5创意玩法技术解析:长视频生成如何从演示走向可控生产一、引言二、六类玩法背后的共通能力三、长视频为什么需要重拍与续写四、成本与生产选型五、六类玩法的提示与分镜策略六、可控生产工作流七、真实成本如何核算八、从2.0到2.5的产品逻辑九、…

采用本地Portal服务器与LDAP服务器组合对用户认证的典型配置

采用本地Portal服务器与LDAP服务器组合对用户认证的典型配置

2026/8/11 0:47:42

一 简介 本文档介绍在无线控制器上配置本地Portal服务器,通过LDAP协议将AC设备解析出的用户名和密码传到LDAP服务器上的组合认证方式对无线用户进行认证的典型配置举例。 二 配置举例 2.1 组网需求 如图1所示组网,AP和Client通过DHCP服务器获取IP地址,要求:在AC上配置本…

从零构建企业级 Coding Agent 的架构设计与工程实践

从零构建企业级 Coding Agent 的架构设计与工程实践

2026/8/11 0:47:42

一、为什么需要自建 Coding Agent? 2024 年至今,Coding Agent 经历了从「概念验证」到「生产力工具」的跃迁。Gemini CLI 起步,Claude Code 探索,再到 Codex、OpenCode、PI、Qoder 等百花齐放,Agent 不再是 LLM 的附属…

RAG 3.0 来了:告别传统知识库,企业 AI 正在全面转向“知识智能体”!

RAG 3.0 来了:告别传统知识库,企业 AI 正在全面转向“知识智能体”!

2026/8/11 0:47:42

从“让AI搜索资料”,到“让AI理解企业”。 过去两年,RAG(Retrieval-Augmented Generation,检索增强生成)几乎成为企业接入大模型的 标准方案 。 企业拥有大量: • 产品文档 技术规范 项目资料 客户信…

树状数组与线段树的区别、联系及应用场景7

树状数组与线段树的区别、联系及应用场景7

2026/8/11 0:37:42

树状数组与线段树的区别数据结构特性树状数组(Fenwick Tree):基于二进制索引的紧凑结构,仅支持前缀和查询与单点更新。线段树(Segment Tree):基于区间划分的二叉树结构,支持区间查询…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/10 5:58:32

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/10 7:54:12

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/10 7:19:21

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

Unity新手入门:从零搭建开发环境与核心概念解析

Unity新手入门:从零搭建开发环境与核心概念解析

2026/8/11 0:07:41

1. 项目概述:为什么Unity是游戏开发者的首选起点如果你对游戏开发感兴趣,或者想进入这个充满创造力的行业,那么“Unity”这个名字你肯定不陌生。它几乎是所有新手开发者、独立游戏团队,甚至是一些3A大厂在特定项目上的首选引擎。为…

Agency-Agents 智能体系统从零搭建实战指南

Agency-Agents 智能体系统从零搭建实战指南

2026/8/11 0:07:41

在开发复杂应用时,我们常常遇到单一模型难以兼顾全局规划与细节执行的困境。有时候,模型擅长创意生成却在逻辑推理上稍显吃力,或者精于代码编写却缺乏对业务上下文的深刻理解。为了解决这个问题,多智能体协作架构应运而生&#xf…

MiniMax 权益码 Token Plan 套餐 9 折优惠,Token Plan 共建邀请计划 至2026.8.31

MiniMax 权益码 Token Plan 套餐 9 折优惠,Token Plan 共建邀请计划 至2026.8.31

2026/8/11 0:07:41

🚀 MiniMax Token Plan MiniMax 推出全新 Token 计划,新增语音、音乐、视频和图片生成权益。 用户邀请好友可享双重福利 订阅一份套餐,解锁最新模型 —— 前沿 Coding 能力、1M 超长上下文、原生多模态,图文音视频共用套餐额度。 …

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…