作用域决定变量生命周期与访问权限:全局变量随脚本加载创建、页面关闭销毁;局部变量在函数/块执行时创建并释放;JavaScript按词法作用域查找变量,外层不可访问内层变量;常见陷阱包括隐式全局变量、var循环绑定问题及闭包延长局部变量生命周期。

全局作用域和局部作用域直接决定了变量什么时候能被读取、什么时候会被销毁,也决定了谁“看得见”它、谁“碰不到”它。
变量生命周期由作用域决定
生命周期指变量从创建到销毁的时间段,不是由代码行数或执行次数决定,而是由作用域边界控制:
- 全局变量在脚本加载完成时就创建,直到页面关闭或脚本卸载才销毁;它始终驻留在内存中(通常在堆或全局对象上)
- 局部变量(函数内用 let、const 或 var 声明)在函数开始执行时分配内存,在函数执行结束时立即释放(栈内存)
- 块级局部变量(如 if 或 for 内用 let/const 声明)只存在于该代码块执行期间;块结束,变量不可访问且内存可回收
访问权限取决于作用域嵌套关系
JavaScript 按照词法作用域规则查找变量:先看当前作用域,找不到就往上级找,直到全局;但反过来不行——外层永远访问不到内层声明的变量:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 函数内部可以自由读写全局变量,也能定义同名局部变量(此时局部变量会遮蔽全局变量)
- 函数外部无法访问函数内部用 let、const 或 var 声明的变量,哪怕函数已执行完毕
- 两个同名变量分别在全局和函数内声明,函数里访问的是局部那个;函数外访问的只能是全局那个
常见陷阱与实际影响
看似简单的规则,容易引发隐蔽问题:
立即学习“Java免费学习笔记(深入)”;
- 忘记用 let/const/var 声明变量,直接赋值(如
name = "Tom"),会意外创建全局变量,污染全局命名空间 - 在循环中用 var 声明变量,因函数作用域特性,所有迭代共享同一个变量,导致闭包中取值异常;改用 let 可按每次迭代创建独立绑定
- 异步回调中访问局部变量时,若变量所在函数已执行完毕,只要仍有引用(如定时器、事件监听器),变量仍存活——这是闭包维持局部变量生命周期的典型表现
浏览器环境中的特殊全局成员
在网页中,全局作用域基本等价于 window 对象(Node.js 中是 global)。因此:
- 显式挂到
window.xxx的变量,和直接在顶层声明的var xxx效果一致,都可跨脚本访问 -
window.location、window.innerWidth等原生属性本质也是全局作用域的一部分,任何地方都能读,但多数不可写 - 模块化(ESM)环境下,顶层声明默认不进入全局作用域,需显式赋值给
window才能暴露

















