全局作用域变量处处可读写、生命周期最长但易被覆盖;函数作用域变量仅函数内可见、每次调用独立副本、外部无法访问;JavaScript按作用域链由内向外查找变量。

全局作用域和函数作用域的核心差异,在于变量“能被谁看到”——不是语法上写在哪,而是执行时的嵌套关系决定访问权限。
全局作用域:所有地方都能直接读写
在任何函数、任何代码块之外声明的变量(用 let、const 或 var),就进入全局作用域。它像一张贴在整栋楼大厅里的公告,楼上楼下、每个房间的人都能看见、也能修改。
- 可见性无限制:函数内部、if 块里、for 循环中,全都能直接访问
- 生命周期最长:从脚本加载开始,到页面关闭才释放
- 风险明显:多个脚本同时定义同名变量,后写的会覆盖先写的;调试时很难定位是谁改了它的值
函数作用域:只对“自己家门内”有效
用 var 在函数体内声明的变量,其作用域就是整个函数体——哪怕它写在 if 或 for 里面,也逃不出这个函数的边界。这就像给变量发了一张“仅限本户出入”的门禁卡。
- 外部完全不可见:函数调用结束后,变量名在外部就彻底“消失”,console.log 会报 ReferenceError
- 内部处处可用:函数开头声明的 var 变量,后面任意位置(包括嵌套的块)都能访问(注意:有变量提升,但值可能为 undefined)
- 每次调用都新建一份:两次调用同一个函数,各自拥有独立的变量副本,互不干扰
关键对比点:访问路径与查找规则
JavaScript 查变量时,不是看“离得近不近”,而是按作用域链一层层往外找:
立即学习“Java免费学习笔记(深入)”;
- 先查当前函数作用域(或块级作用域)
- 找不到,就往上一级函数作用域找
- 一直找到全局作用域为止;再找不到就报错
所以函数内能访问全局变量,是因为它处在作用域链的顶端;而全局代码访问不到函数内的 var 变量,是因为那条链根本没通到函数内部。


















