学习笔记(7-01)函数闭包—⭐️
目录1、定义2、闭包示例12.1、分析3、特性3.1、示例2闭包实现私有变量实用场景4、注意事项4.1、循环中的闭包坑5、总结1、定义闭包带着外部变量访问权限的内部函数就算外部函数执行完退出了内部函数依然能正常访问、操作它创建时所在的外部函数里的变量这些变量的访问权不会随着外部函数的结束而消失。严谨的表述当函数被创建并返回或被保存时它会携带自己的词法环境也就是创建它时所处的外部作用域这个函数 它携带的词法环境就构成了闭包。2、闭包示例11、外部函数就像一间教室里面的变量是教室里的桌椅内部函数就像一个学生闭包就是这个学生离开教室时把桌椅的 “使用权凭证” 带在了身上哪怕教室已经锁门外部函数执行完毕学生依然能使用这些桌椅访问外部变量。2、内部函数学生 外部变量的访问引用桌椅的使用权凭证 闭包。3、闭包并没有复制外部变量只是持有了外部变量的访问引用。// 外部函数functionouterFunc(){// 外部函数作用域中的变量仅在 outerFunc 内部可访问正常情况下外部无法触及letouterVar我是外部函数的变量;// 内部函数闭包的核心这个内部函数就是闭包载体functioninnerFunc(){// 内部函数访问了外部函数的变量 outerVarconsole.log(outerVar);}// 外部函数返回内部函数让内部函数可以在外部被调用returninnerFunc;}// 1. 调用外部函数得到内部函数此时 outerFunc 已经执行完毕按常理其内部变量应被销毁constmyClosureouterFunc();// 2. 调用内部函数依然能访问到 outerFunc 中的 outerVar这就是闭包的效果myClosure();// 输出我是外部函数的变量2.1、分析outerFunc 执行完毕后按照 JS 的垃圾回收机制它的内部变量 outerVar 应该被回收销毁。但因为 innerFunc 访问了 outerVar且 innerFunc 被返回并赋值给了 myClosure保留了引用所以 outerVar 不会被销毁会被 innerFunc 携带保存。当调用 myClosure() 时innerFunc 依然能从自己携带的「词法环境」中找到 outerVar这就是闭包在起作用。3、特性访问外部变量内部函数可以访问外部函数的变量甚至是外部函数的外部函数的变量词法作用域链。变量持久化外部函数执行完毕后其内部变量不会被垃圾回收而是被闭包持有直到闭包本身被销毁比如 myClosure null。隔离作用域闭包可以创建私有变量避免变量污染全局作用域这是闭包最常用的实际场景。3.1、示例2闭包实现私有变量实用场景// 实现一个简单的计数器变量 count 仅能通过 increment 和 getCount 操作无法直接修改functioncreateCounter(){// 私有变量仅在 createCounter 内部可访问全局无法直接触及letcount0;// 返回一个对象包含两个方法这两个方法都是闭包持有 count 的引用return{// 自增方法increment:function(){count;},// 获取当前值方法getCount:function(){returncount;}};}// 创建计数器实例1constcounter1createCounter();counter1.increment();counter1.increment();console.log(counter1.getCount());// 输出2// 创建计数器实例2与 counter1 互不干扰各自持有独立的 count 变量constcounter2createCounter();console.log(counter2.getCount());// 输出0示例中count 就是私有变量全局无法直接修改只能通过 increment() 和 getCount() 操作避免了变量污染这也是闭包在实际开发中的核心用途之一。4、注意事项内存泄漏风险如果闭包被长期保存比如赋值给全局变量且持有大量无用的外部变量会导致这些变量无法被垃圾回收从而造成内存泄漏。解决方案不需要使用闭包时手动解除引用比如 myClosure null。变量共享问题在循环中创建闭包时容易出现变量共享导致结果不符合预期需要注意。4.1、循环中的闭包坑// 错误示例循环中创建闭包期望输出 0、1、2实际输出 3、3、3for(vari0;i3;i){setTimeout(function(){console.log(i);// 输出3、3、3},1000);}原因分析var 声明的变量没有块级作用域i 是全局变量循环结束后 i 的值为 3。定时器中的函数是闭包它访问的是全局的 i当定时器执行时循环已经结束i 已经是 3所以输出 3 次 3。解决方案使用 let 声明变量let 有块级作用域每次循环都会创建一个独立的 i。for(leti0;i3;i){setTimeout(function(){console.log(i);// 输出0、1、2},1000);}使用立即执行函数IIFE创建独立作用域for(vari0;i3;i){(function(j){setTimeout(function(){console.log(j);// 输出0、1、2},1000);})(i);}5、总结闭包的成立必须满足两个核心条件缺一不可存在嵌套函数内部函数嵌套在外部函数中。内部函数被「带出」外部函数的作用域比如被返回、被赋值给外部变量、被传递给其他函数作为参数且内部函数访问了外部函数的变量。示例不满足条件的 “伪闭包”不算真正的闭包functionouterFunc(){letouterVar外部变量;// 内部函数仅在外部函数内部调用没有被带出外部作用域functioninnerFunc(){console.log(outerVar);}// 直接在外部函数内部执行内部函数不是闭包innerFunc();}outerFunc();// 输出外部变量这只是普通的嵌套函数不是闭包示例中虽然有内部函数访问外部变量但内部函数没有被带出外部函数的作用域外部函数执行完毕后outerVar会被正常回收不构成闭包。

相关新闻

第十八章: Kubernetes - Rancher 控制面板使用

第十八章: Kubernetes - Rancher 控制面板使用

第十八章: Kubernetes - Rancher 控制面板使用 18.1 安装 Rancher 1. 安装 Helm(Linux 或 macOS) curl https://get.helm.sh/helm-v3.14.4-linux-amd64.tar.gz -o helm-v3.14.4-linux-amd64.tar.gz tar -zxvf helm-v3.14.4-linux-amd64.tar.…

2026/5/17 11:28:03 阅读更多 →
攻防世界免费题库难度三(2)

攻防世界免费题库难度三(2)

菜鸟萌新,如有错误还请大佬指正。一、simple_js查看页面源代码查看是否真的只是密码爆破。function dechiffre(pass_enc){var pass "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";var tab pass_enc.split(,);var tab2 pass.split(,);var …

2026/5/17 11:28:02 阅读更多 →
Spring AI 第 8 篇 ChatMemory 详解:如何让模型记住你的每一次对话

Spring AI 第 8 篇 ChatMemory 详解:如何让模型记住你的每一次对话

聊天记忆 - 概念 🤒 大模型是无状态的,意味着不会保留前一次交互的信息。比如,第一次调用时告诉模型我喜欢吃土豆,第二次调用时问模型我喜欢吃什么,此时模型是不知道我喜欢吃土豆的。无状态有无状态的好处,但弊端就是有时候我们想要让它变成有状态。比如,我们想要跨多…

2026/7/5 22:30:12 阅读更多 →

最新新闻

Iron Node完全指南:如何用Chrome开发者工具调试Node.js代码

Iron Node完全指南:如何用Chrome开发者工具调试Node.js代码

Iron Node完全指南:如何用Chrome开发者工具调试Node.js代码 【免费下载链接】iron-node Debug Node.js code with Chrome Developer Tools. 项目地址: https://gitcode.com/gh_mirrors/ir/iron-node 想要提升Node.js调试效率吗?Iron Node是一个终…

2026/7/6 15:16:13 阅读更多 →
数据的“瞬间移动”:解密DataAdapter的异步并行魔法!

数据的“瞬间移动”:解密DataAdapter的异步并行魔法!

一、编译期的“幽灵”:它比JVM更早醒来 在上一场与时间的赛跑中,我们见识了注解处理器(APT)如何在编译期改写代码。但那只是“静态”的胜利。 现在,让我们进入运行时的“动态”战场。想象一个场景:你正在开…

2026/7/6 15:12:07 阅读更多 →
5分钟在Windows搭建RTMP流媒体服务器:Nginx-RTMP-Win32完整指南

5分钟在Windows搭建RTMP流媒体服务器:Nginx-RTMP-Win32完整指南

5分钟在Windows搭建RTMP流媒体服务器:Nginx-RTMP-Win32完整指南 【免费下载链接】nginx-rtmp-win32 Nginx-rtmp-module Windows builds. 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-rtmp-win32 想在Windows平台上快速搭建自己的流媒体直播服务器吗…

2026/7/6 15:10:00 阅读更多 →
用经验驾驭AI:大龄程序员的第二春

用经验驾驭AI:大龄程序员的第二春

用经验驾驭AI:大龄程序员的第二春 前几天,团队里一个刚毕业的小伙子凑过来看我写代码。他盯着屏幕看了半天,突然冒出一句:“哥,你这个写代码的方式好奇怪,全是用中文描述需求,让AI生成代码&…

2026/7/6 15:07:57 阅读更多 →
朴素贝叶斯分类器 Python 实现:从零构建 2 个核心函数与拉普拉斯平滑

朴素贝叶斯分类器 Python 实现:从零构建 2 个核心函数与拉普拉斯平滑

朴素贝叶斯分类器 Python 实现:从零构建核心函数与拉普拉斯平滑实战1. 朴素贝叶斯算法原理精要朴素贝叶斯分类器基于贝叶斯定理构建,其核心公式为:P(y|x) P(x|y) * P(y) / P(x)其中:P(y|x)是给定特征x时类别y的后验概率P(x|y)是似…

2026/7/6 15:05:55 阅读更多 →
SDOI2010试题评价

SDOI2010试题评价

这套题之所以经典(或者说“臭名昭著”),是因为它完美展现了OI题目的两个极端:极致的思想之美与极致的工程之恶。 第一部分:噩梦的巅峰——猪国杀 题目定位: OI史上最复杂的模拟题,没有之一。它更像是一个软件工程项目的需求文档,而不是一道5个小时的竞赛题。 详细解剖…

2026/7/6 15:05:55 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻