局部变量通常能被及时回收,而全局变量几乎不会被自动回收;前者生命周期绑定函数执行、栈中分配、无引用即回收,后者挂载全局对象、随页面存在至卸载,需手动干预释放。

局部变量和全局变量在内存回收上的核心区别在于:局部变量通常能被及时回收,而全局变量几乎不会被自动回收。
局部变量:函数结束即触发回收条件
局部变量声明在函数内部,生命周期严格绑定于函数执行过程。函数调用开始时分配内存(可能在栈或堆),执行结束后,只要没有外部引用,引擎就能明确判定它“已不可达”,垃圾收集器会在下一次回收周期中将其内存释放。
- 常见场景:普通函数内用 let、const 或 var 声明的变量,函数返回后立即失去引用
- 例外情况:若形成闭包(比如函数返回一个内部函数,且该函数访问了局部变量),局部变量会因被持续引用而延迟回收
- 优势:作用域小、生命周期短,回收时机清晰,内存压力低
全局变量:生命周期与页面同存,基本不回收
全局变量挂在全局对象(如浏览器中的 window)上,从脚本加载起就存在,直到页面卸载才销毁。垃圾收集器无法判断你是否后续还会用到它,因此不会主动回收——哪怕你写完就再没访问过它。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 风险点:长期占用内存;命名冲突;模块间耦合加剧
- 手动干预:可显式赋值为 null 或 undefined,帮助 GC 在下次标记阶段识别其为“不可达”
- 现代实践:优先用模块封装、IIFE 或 ES6 模块作用域替代全局挂载
内存位置与回收效率也不同
局部变量多存储在调用栈中,栈空间本身具有天然的进出顺序,函数退出时栈帧弹出,相关变量自然失效;而全局变量存在于堆内存,作为全局对象的属性长期驻留,依赖 GC 的标记-清除算法扫描,效率更低、时机更不确定。
立即学习“Java免费学习笔记(深入)”;
- 访问速度:局部变量更快(栈访问 vs 堆查找 + 属性遍历)
- 回收确定性:局部变量的回收是“强保证”(无闭包干扰时),全局变量则是“弱保证”(基本靠页面关闭兜底)
实际开发建议
避免无意创建全局变量(比如忘记用 let/const 直接赋值),对确实需要跨函数共享的数据,考虑用模块级变量或显式管理生命周期,而不是依赖全局挂载。

















