变量作用域决定变量能否使用、引用对象及生命周期,是执行逻辑的底层规则;全局变量易被意外修改,函数内变量具函数或块级作用域,嵌套函数按词法作用域向上查找,声明方式影响提升行为与访问时机。

变量作用域直接决定代码里某个变量“能不能用”“用的是谁”“什么时候消失”,它不是语法装饰,而是执行逻辑的底层规则。写错作用域,轻则值拿不到、报错,重则逻辑错乱、状态污染。
全局变量随时可改,但容易被意外覆盖
在函数外用 var、let 或 const 声明的变量属于全局作用域(模块顶层除外),整个脚本都能读写它。
- 好处是方便共享数据,比如计数器
let count = 0被多个按钮点击函数共用 - 坏处是任何地方都能改它,比如一个函数里写了
count = 999,其他地方就突然失效了 - 浏览器中,
var声明的全局变量会自动挂到window上,let/const不会——这点常被忽略
函数内部变量只在自己家,出门口就失效
函数内用 let、const 或 var 声明的变量,只在该函数体内有效。
-
var声明有函数作用域,哪怕写在if里,也能被函数内其他位置访问 -
let/const是块级作用域,写在if或for大括号里,外面就访问不到 - 函数参数也是局部变量,修改它不会影响调用时传进来的原始值(基本类型)
嵌套函数能向上找变量,但不能反向穿透
JavaScript 按照词法作用域查找变量:从当前作用域开始,一层层往外找,直到全局。
- 内部函数可以读写外部函数的变量,这是闭包的基础
- 但外部函数访问不到内部函数声明的
let变量,哪怕内部函数已执行完 - 如果内外都有同名变量,内部的会“遮蔽”外部的,优先使用内部那个
声明方式不同,提升行为和访问时机也不同
变量怎么声明,直接影响它“什么时候能用”:
-
var声明会被提升到函数或全局顶部,但赋值不提升——所以先console.log(x)会得undefined -
let/const不提升,声明前访问直接报ReferenceError,中间那段区域叫“暂时性死区” -
function声明整体会被提升,所以可以在定义前调用;而const fn = () =>{}属于赋值,不提升
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











