javascript作用域指变量的可见与可用范围,分全局、函数、块级三类,通过作用域链逐级查找变量。

JavaScript 作用域,说白了就是“变量在哪儿能被看见、在哪儿能用”。就像你家的客厅——你在客厅里放了一杯水,家人进来能喝到;但隔壁邻居家看不到这杯水,也喝不到。变量也一样:它在哪声明的,就决定了谁“看得见”它、谁“够得着”它。
全局作用域:整个文件都认得它
在函数外面直接用 var、let 或 const 声明的变量,或者没加任何关键字就赋值(比如 a = 10),它就进了全局作用域。
- 浏览器里,它会自动变成 window.a,所有地方都能访问
- Node.js 里,它属于 global 对象
- 但尽量少用——就像把钥匙挂门口,谁路过都能拿,容易出问题
函数作用域:只在函数肚子里有效
用 var 在函数里声明的变量,只在这个函数内部可用,连它的子函数(嵌套函数)也能看到它(因为作用域链向上找)。
- 函数一执行完,这些变量通常就“退休”了(内存可能被回收)
- 注意:var 有变量提升,哪怕写在函数最后,也能在开头被访问(只是值是 undefined)
- 比如:function fn() { console.log(x); var x = 5; } 不报错,但输出 undefined
块级作用域:大括号 {} 划出来的“小房间”
ES6 起,用 let 和 const 在 if、for、{} 这类块里声明的变量,只在这一对花括号里有效。
- if (true) { let a = 1; } console.log(a); // 报错 ReferenceError
- 它不会被提升,不存在“先用后声明”的情况
- 同名变量可以“遮蔽”外层的:里面声明个 let a,就暂时盖住外面的 a
作用域链:找不到就“往上问长辈”
当代码里用一个变量,JavaScript 不是一上来就去全局翻,而是按“就近原则”一层层找:
- 先看当前块或函数里有没有声明
- 没有?就去找它的上一级函数(父作用域)
- 再没有?继续往上,直到找到全局作用域
- 全都没找到,就抛出 ReferenceError
这个逐级查找的路径,就是作用域链——它不是你写的代码,而是引擎自动维护的一条“寻人路线图”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











