详解变量提升和闭包的应用
文章目录堆栈内存变量提升带var和不带var的区别作用域链的拓展闭包什么是闭包闭包的应用堆栈内存栈内存作用域提供一个供js代码自上而下执行的环境代码都是在栈内存中执行存储基本数据类型值释放当栈内存被销毁存储的那些基本值也跟着被销毁了一般函数执行完成所形成的私有作用域会自动释放除非某些内容被栈内存以外的变量占用了此时栈内存不能释放全局栈内存只有在页面关闭的时候被释放堆内存引用值对应的空间存储引用类型值对象键值对 函数代码字符串当前堆内存释放销毁那么这个引用值彻底没了释放当对内存没有被任何的变量或其他东西所占用浏览器会在空闲的时候自主进行内存回收把所有不被占用堆的内存销毁掉。比如我让ary1nullnull是空对象指针让原始变量谁都不指原有被占用的对内存就没有被东西占用了浏览器在空闲时候就把该堆内存销毁了。举例var a10经历三个过程声明变量a没有赋值默认是undefined在当前作用域开辟一个位置存储12栈让变量a和12关联在一起定义赋值var a[1,2]声明变量a开辟一个新的内存空间存储[1,2]堆让变量a和该对内存地址关联起来如果是函数的话会开辟一个新的内存空间存储代码字符串执行的时候开辟一个私有作用域栈把之前创建函数时存储的字符串执行执行完毕该栈内存销毁。变量提升js是先预编译再执行预编译的过程就是扫一遍把变量绑定作用域。所以才有变量提升。带var的只声明未定义带function的把声明定义都完成了console.log(a)console.log(sum)vara1functionsum(){console.log(hello world)}执行结果是【注意】私有作用域先形参赋值再变量提升再代码执行带var和不带var的区别在全局作用域下声明一个变量也相当于给window对象设置了一个属性属性的值就是属性值私有作用域声明的私有变量和window没关系console.log(a)//undefined 变量提升不报错conosle.log(window.a)//undefined 给window设置一个对象console.log(ainwindow)//true window存在a属性vara12console.log(a)//12conosle.log(window.a)//12如果不带var,看以下代码a12conosle.log(a)//12console.log(window.a)//12console.log(a)//报错 不执行a12conosle.log(a)console.log(window.a)console.log(window.a)//undefinedconsole.log(ainwindow)//falsea12//window.a 12conosle.log(a)//12console.log(window.a)//12【总结】在全局作用域加var是全局变量由于window对象和全局有映射关系也就设置了window的属性不加var的本质是window下的属性自然没有变量提升【拓展】在私有作用域中带var的在私有作用域有变量提升都声明为死于变量和外界没有任何关系不带var不是私有变量它会向它的上级作用域查找看是否为上级变量不是则继续向上查找一直查找到window位置这种查找机制叫做私有作用域链作用域链的拓展functionfn(){//变量提升无b13console.log(binwindow)//trueconsole.log(b)}fn();//13console.log(b)//13在作用域链查找过程中如果找到win也没有这个变量相当于给win设置了一个属性bwindow.b13闭包什么是闭包·存在没被释放的内存当前作用域使用其他作用域的变量比如functionb(){vara1returnfunctionc(){console.log(a)}}vareb()e()//输出1这就是个闭包b执行完了栈内存也没有被释放里面的a被b栈内存以外的变量引用。再看e执行的时候器作用域是全局作用域但使用到了b的私有作用域下的变量a闭包的应用为了保证js 的性能堆栈内存的性能优化应该尽可能减少闭包的使用不被销毁的堆栈内存是耗性能的闭包具有保护作用保护私有变量不受外界干扰在项目中尤其是团队写作开发的时候应尽可能减少全局变量的使用以防止相互之间的冲突那么此时哦我们可以把自己的一部分内容封装到一个闭包里让全局变量变为私有变量。基于return把需要供外面使用的方法暴露出去。varZepto(function(){//...return{xxx:function(){}}})或者当想改变一个对象的值比如user之前用user.name但这个方法不够好当程序过于复杂会一不小心改动一些东西变化的轨迹就非常难以追踪。虽然有效但非常危险。所以想把修改过程管控起来就用到了闭包。可以定义一个function user(name)。在里面var一个age,sex。这时候返回的不是一个确切的数值是一个对象对象里包含不同的方法比如getName,setName。方法就是定义在对象里面的函数。当做的项目内部数据流足够复杂那我们此处必须得找个办法来归纳不能让对象里面的值在里面被随便修改必须得找一个像一个接口一样的东西必须得按我的方法才能修改和设置某个值这样严谨很多。闭包可以通过走子函数来获取母函数的函数作用域然后去存取里面的值。这就是闭包的好处和特点。3. 闭包具有保存作用形成不销毁的栈内存把一些值保存下来方便后面的调取使用可以基于闭包解决用var for循环给多个按钮绑定事件无论点击第几个i都是最后那个。这个问题可以直接直接用let解决此处说用闭包解决的办法假如有五个按钮for(vari0;ibuttonList.length;i){buttonList[i].onclickfunction(){console.log(i)}}//此时无论点击第几个按钮打印的都是4因为js在es6之前没有块级作用域。当我们点击的时候外层循环已经结束可以点击的时候页面已经加载完成页面加载完成预示着js代码都已经执行完成也就是循环也都执行完成外层循环结束已经让全局下的i为4用闭包解决如下for(vari0;ibuttonList.length;i){buttonList[i].onclick(function(){//让自执行函数执行把执行的返回值(return)赋值给onclick此时onclick绑定的是返回的小函数点击的时候执行的是小函数自执行函数在给事件赋值的时候已经执行了returnfunction(){console.log(i)//上级作用域自执行函数形成的作用域}})()}

相关新闻

OpenAI发布Presence企业智能体服务,75%问题可自动解决

OpenAI发布Presence企业智能体服务,75%问题可自动解决

OpenAI近日发布了一款名为Presence的企业级服务,专为部署语音与聊天智能体而设计,可处理客户及员工的各类请求,有望实现部分原本由一线支持团队承担的工作的自动化。这些智能体不仅能够回答问题,还能操作IT系统。企业可自行设定智…

2026/7/28 20:03:52 阅读更多 →
OpenCore Legacy Patcher完整教程:四步让老Mac免费运行最新macOS

OpenCore Legacy Patcher完整教程:四步让老Mac免费运行最新macOS

OpenCore Legacy Patcher完整教程:四步让老Mac免费运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方"抛…

2026/7/28 20:03:52 阅读更多 →
线程通讯(一)

线程通讯(一)

##底层业务线数据隔离 要求:子线程循环跑30次,暂停,然后跑到主线程40次,接着子线程循环跑30次,暂停,主线程跑40次 如此往复,一共交替50次 public class ThreadTest {private static Lock lock …

2026/7/28 20:03:52 阅读更多 →

最新新闻

龙芯平台GitLab Runner Docker执行器配置实战:从镜像拉取到权限调优

龙芯平台GitLab Runner Docker执行器配置实战:从镜像拉取到权限调优

最近在给一个内部项目做 CI/CD 迁移,目标是把 GitLab Runner 的执行器从 Shell 切换到 Docker。听起来是个标准操作,但真动起手来,才发现坑比想象中多。尤其是在国产化信创环境下,当宿主机是龙芯 3B6000 这样的 LoongArch 架构平台…

2026/7/28 20:16:07 阅读更多 →
数据结构算法 - 线性表的实现

数据结构算法 - 线性表的实现

数组 是线性表数据结构中 顺序存储 的具体实现。用一组 连续 的内存空间,存储 相同类型 的数据 链表 是线性表数据结构中 链式存储的具体实现。用 节点 的 指针 把各个节点串联在一起 数组的基本操作 在指定位置插入元素删除指定元素查找值等于给定值的元素查找数组…

2026/7/28 20:16:07 阅读更多 →
VMware虚拟机导致宿主机蓝屏:从原理到排查的完整指南

VMware虚拟机导致宿主机蓝屏:从原理到排查的完整指南

“我说了,我什么都没做!”这句话是不是很熟悉?当你面对一个突然蓝屏的电脑,而VMware虚拟机窗口还定格在启动画面时,那种百口莫辩的无力感瞬间涌上心头。你只是像往常一样,双击了那个虚拟机的图标&#xff0…

2026/7/28 20:16:07 阅读更多 →
物联网硬件安全:SE050芯片与PIC32MX795F512L集成方案

物联网硬件安全:SE050芯片与PIC32MX795F512L集成方案

1. 物联网安全现状与硬件级解决方案的必要性在2023年全球物联网连接数突破160亿的背景下,安全事件同比增长了47%。传统基于软件加密的方案暴露出致命缺陷——某智能家居厂商的密钥泄露事件导致超过200万台设备被劫持。这揭示了物联网安全的本质矛盾:终端…

2026/7/28 20:16:07 阅读更多 →
Zenmap图形化Nmap工具:从安装配置到实战扫描技巧全解析

Zenmap图形化Nmap工具:从安装配置到实战扫描技巧全解析

1. 项目概述:为什么需要Zenmap?如果你接触过网络安全、系统运维或者仅仅是好奇自己的网络里有什么,那么Nmap这个名字你一定不陌生。它被誉为“端口扫描之王”,是探测网络、发现主机、识别服务与操作系统的瑞士军刀。然而&#xff…

2026/7/28 20:16:06 阅读更多 →
AI历史地理学习黄金三角模型(算法×史料×地学):北大团队20年沉淀的4层能力图谱首次公开

AI历史地理学习黄金三角模型(算法×史料×地学):北大团队20年沉淀的4层能力图谱首次公开

更多请点击: https://kaifayun.com 第一章:AI历史地理学习黄金三角模型的范式革命 传统AI教育常将历史脉络、地理语境与技术演进割裂处理,导致学习者难以建立系统性认知。黄金三角模型打破这一局限,以“时间轴—空间域—技术栈”…

2026/7/28 20:15:06 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻