作用域决定变量生命周期而非代码行数:全局变量随页面加载存在至关闭,局部变量在进入作用域时创建、退出时销毁;访问遵循词法作用域向上查找规则,内外层同名变量互不影响。

作用域直接决定变量什么时候诞生、什么时候消失,而不是代码写了几行或执行了多少次。
全局变量:从页面加载开始,到关闭才结束
在脚本最外层(函数/块之外)用 var、let 或 const 声明的变量,一加载就存在,一直驻留在内存里,直到整个页面卸载或刷新。
- 浏览器中它会自动成为 window 对象的属性(比如
let name = "Alice",之后window.name也能访问) - 没加声明直接赋值(如
age = 25)也会变成全局变量,但这是隐式创建,容易污染命名空间,应避免 - 生命周期长,意味着它始终占用内存,频繁定义可能影响性能
局部变量:进作用域时出生,出作用域时“退场”
函数内部或代码块(如 if、for)中声明的变量,只活在它被定义的那个范围里。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 函数内用 var 声明:属于函数作用域,函数执行完就释放(但注意:var 有变量提升,声明提前,初始化不提前)
- 函数或块内用 let/const 声明:属于块级作用域,仅在对应
{}内有效;块执行结束,变量不可访问,内存可被回收 - 哪怕函数已执行完毕,只要还有闭包引用它(比如返回了一个内部函数),这个局部变量仍会继续存活
访问权限由嵌套关系决定,不是靠“谁先写”
JavaScript 按照词法作用域向上查找:当前作用域找不到,就往父级找,一直到全局;但反向永远不行——外层代码永远看不到内层定义的变量。
立即学习“Java免费学习笔记(深入)”;
- 函数内可以读写全局变量,也可以用同名变量遮蔽它(比如函数里再写
let count = 10,那函数里用的就是这个局部的count) - 函数外尝试访问函数内的
let item,会直接报ReferenceError - 两个同名变量分别在全局和函数内声明,它们互不干扰,各自按自己的作用域规则生灭
几个容易踩坑的实际表现
规则简单,但细节常引发意外行为。
- 循环中用
var声明计数器,所有迭代共享同一个变量,导致异步回调取到的是最后的值;换成let就能为每次迭代创建独立绑定 - 定时器或事件监听器里访问的局部变量,如果函数早已执行完,但监听器还活着,变量就靠闭包维持着——这不是 bug,是机制
- 忘记声明关键字就赋值,表面像局部变量,实际悄悄挂到了全局,后续可能被其他逻辑意外修改

















