企业内部网站模板广西建设网郭业棚

张小明 2026/1/10 16:00:08
企业内部网站模板,广西建设网郭业棚,推荐做网站的公司,如何制作网站导航栏拨开迷雾#xff1a;一次深入 JavaScript 闭包与内存模型的探索之旅 引言 JavaScript 中的闭包#xff08;Closure#xff09;是一个老生常谈的话题#xff0c;但真正能从底层内存机制上将其彻底讲透的人并不多。在很长一段时间里#xff0c;我对闭包的理解停留在“函数记…拨开迷雾一次深入 JavaScript 闭包与内存模型的探索之旅引言JavaScript 中的闭包Closure是一个老生常谈的话题但真正能从底层内存机制上将其彻底讲透的人并不多。在很长一段时间里我对闭包的理解停留在“函数记住其外部变量”的表层概念上。每当遇到复杂的场景如防抖节流、循环中的异步回调我往往知其然而不知其所以然。最近通过一系列的深度剖析和自我诘问我终于构建起了一个关于闭包、堆栈内存以及作用域链的清晰心智模型。本文旨在记录我从困惑到顿悟的整个思维演进过程希望能帮助同样受困于此的开发者找到突破口。阶段一最初的误区与纠正——混淆“调用者”与“作用域”故事始于一个经典的防抖函数实现。我想弄清楚为什么多次触发事件时timer变量能够被共享。JavaScriptfunction debounce(fn, t) { let timer; // 关键这个变量为什么能被共享 return function() { if(timer) clearTimeout(timer); timer setTimeout(fn, t); } } // debounce 函数只执行了一次 const handler debounce(fn, 500); // 无论 handler 之后被谁调用被调用多少次 box.addEventListener(mousemove, handler);我的纠正认知我起初错误地将变量共享归因于调用者this相同。通过深入分析我认识到“调用者是谁”与“作用域在哪”是完全独立的两个维度。timer之所以被共享根本原因在于外部函数debounce(fn, 500)只执行了一次。它执行这一次就在堆内存中创建了一个唯一的闭包环境仓库随后返回的函数始终持有这个唯一仓库的引用。下面的流程图展示了初始化阶段和执行阶段的区别Code snippet运行时阶段 (多次触发事件)初始化阶段 (只执行一次)堆内存 (Heap)[[Environment]] 隐藏指针永久锁定 Scope_1通过携带的指针回溯访问调用 handler 函数浏览器触发 mousemove浏览器再次触发 mousemove执行 debounce(fn, 500)创建并返回匿名函数(即 handler)创建唯一的词法环境对象(Scope_1)变量: timer阶段二深入内存模型——理解独立的闭包实例解决了共享的问题后新的疑问产生了如果外部函数执行多次产生的闭包是共享的还是独立的JavaScriptfunction fun() { let timer 0; function test() { timer; } return test; } // 两次独立的调用 const aa fun(); const cc fun();深入内存层面的真相为了解答这个问题我引入了堆Heap和栈Stack的内存模型。我意识到必须将“函数的定义”和“函数的调用”区分开来。每次函数调用都是一次全新的内存分配过程。如下图所示aa和cc虽然源自同一个工厂函数但它们在内存中是两条完全平行的线Code snippet堆内存(Heap) - 第二次调用 fun()堆内存(Heap) - 第一次调用 fun()栈内存(Stack)[[Environment]]指向[[Environment]]指向引用地址引用地址函数对象 test_B词法环境 Scope_Btimer: 0函数对象 test_A词法环境 Scope_Atimer: 0变量 aa变量 ccconst aa fun()在堆中创建了一套全新的环境Scope_A和函数test_A。const cc fun()在堆中又创建了另一套完全独立的环境Scope_B和函数test_B。它们互不干扰各自维护私有的状态。阶段三终极顿悟——“去中心化”的直连模型在构建了内存模型后我迎来了最大的思维障碍也是理解闭包最关键的一步。核心困惑与突破我曾潜意识地认为子函数要访问父级变量必须通过父函数的地址作为中介。我担心如果父函数执行完被销毁了闭包链条会不会断裂。最终的顿悟在于发现闭包的连接是“去中心化”的直连不需要父函数作为“中间商”。当const aa fun()执行完毕外部函数fun的执行上下文Execution Context从栈中弹出。虽然fun的作用域通常会被销毁但因为返回的test函数即aa的[[Environment]]指针依然引用着这个词法环境根据垃圾回收的可达性原则这个环境必须被保留在堆内存中。下图清晰地展示了这种错误的依赖关系与真实的直连关系之间的区别Code snippet真实的内存模型(直连去中心化)错误的理解模型(依赖父函数)指向错误地认为需要通过父函数再找到指向与闭包无关已断开联系[[Environment]]指针直接锁定子函数 test栈变量 aa词法环境 Scope(独立堆对象包含 timer)父函数 fun(已执行完毕可被销毁)子函数 test栈变量 aa父函数 fun词法环境 Scope总结我的最终理解模型父函数只是一个“工厂”负责创建环境和子函数。一旦子函数被创建它就通过内部的[[Environment]]指针直接、独立地持有了对环境的引用。闭包的本质就是返回的函数对象手中持有一把直通其出生地词法环境的万能钥匙。这条链接与外部函数是否存活再无瓜葛。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站结构有哪些类型什么网站找厂做袜子

开源TTS哪家强?对比FastSpeech、Tacotron与EmotiVoice 在智能语音助手、有声书、虚拟偶像和游戏NPC日益普及的今天,用户早已不再满足于“能说话”的机器语音。他们期待的是富有情感、个性鲜明、宛如真人的声音体验。然而,面对琳琅满目的开源T…

张小明 2026/1/7 10:39:08 网站建设

做网站赚不到钱了单页网站有哪些

Windows Store 应用通知与磁贴更新全解析 1. 磁贴的创建与管理 在 Windows Store 应用开发中,磁贴和徽章是与用户进行有效沟通的重要工具,即便应用处于未运行状态,也能发挥作用。以下是关于磁贴和徽章的详细介绍: - 实时磁贴的作用 :实时磁贴能够鼓励用户启动应用并与…

张小明 2026/1/9 8:22:21 网站建设

网站加入百度地图wordpress重新发布

AutoUnipus终极指南:U校园全自动学习解决方案 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 还在为U校园的重复性学习任务烦恼吗?AutoUnipus智能助手为你…

张小明 2026/1/4 6:17:53 网站建设

青岛高端网站开发公司html常用标签代码大全

Dify在品牌年轻化传播中的语感匹配度测试 在Z世代逐渐掌握消费话语权的今天,品牌若想真正“年轻化”,光靠换一个潮logo或请个流量明星远远不够。真正的挑战在于:能否用年轻人的语言和他们对话? 这不仅是文案风格的问题&#xff0c…

张小明 2026/1/8 17:12:13 网站建设

网站建设的初步预算php开发企业网站教程

VNote跨平台笔记软件安装与配置完整指南 【免费下载链接】vnote 项目地址: https://gitcode.com/gh_mirrors/vno/vnote 项目亮点速览 VNote是一款专注于Markdown格式的跨平台笔记软件,基于Qt框架开发,提供了出色的编辑体验和便捷的笔记管理功能…

张小明 2026/1/7 10:15:06 网站建设

沈阳自助建站模板php做商城网站

第一章:Open-AutoGLM性能飞跃的核心原理Open-AutoGLM 在大语言模型推理效率与准确率之间实现了前所未有的平衡,其性能飞跃源于三大核心技术机制的协同优化:动态稀疏注意力、自适应计算图剪枝和量化感知知识蒸馏。动态稀疏注意力机制 传统Tran…

张小明 2026/1/3 22:11:48 网站建设