变量生命周期指其从创建到销毁的全过程:声明时分配内存(var提升初始化为undefined,let/const存在TDZ),作用域决定可访问性(全局、函数、块级),引擎自动回收不再被引用的变量及对象。

变量生命周期,就是它从“出生”到“消失”的全过程——什么时候被创建、什么时候能用、什么时候被清理。理解它,不是背概念,而是看清代码执行时内存里发生了什么。
变量什么时候被创建?
声明那一刻就分配内存,但具体时机取决于声明方式:
-
var:在函数或全局作用域的“内存创建阶段”就被初始化为
undefined(即提升),但真正赋值发生在执行到那行代码时; - let/const:也在作用域头部被“声明”,但不会初始化,直到执行到声明语句才进入可访问状态——这中间那段区域叫“暂时性死区(TDZ)”,提前访问会报错;
- 函数参数、for 循环中的
let i等,都在对应作用域开始执行时创建。
变量什么时候能被访问?
取决于它的作用域边界,而不是代码位置的上下顺序:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 全局变量:脚本加载后,整个页面生命周期内随时可读写(浏览器中挂载在
window上); - 函数内用
var/let/const声明的变量:只在该函数体内有效,外部调用直接报ReferenceError; - 用
let/const在if、for等{}内声明的变量:仅限该代码块内,块外不可见——哪怕在同一函数里也不行。
变量什么时候被销毁?
不是手动删除,而是由 JavaScript 引擎自动回收,前提是它“不再被需要”:
立即学习“Java免费学习笔记(深入)”;
- 全局变量:存活到页面关闭,window 对象释放时才清理;
- 函数内的局部变量:函数执行结束,且没有闭包保留对其的引用,引擎会在后续垃圾回收中释放内存;
- 块级变量(如
if块里的let x):块执行完毕即失去引用,通常很快被回收。
一个容易忽略的关键点:引用类型和生命周期
变量本身生命周期短,但它指向的对象可能活得更久:
- 比如函数内创建一个对象
let obj = { name: 'Alice' },函数结束时obj变量被销毁,但如果这个对象被返回、赋给全局变量、或传入定时器回调,那对象本身还在内存中; - 真正决定对象是否被回收的,是“是否还有活跃的引用链”,而不是声明它的那个变量还在不在。


















