JavaScript作用域遵循词法作用域规则:内部可访问外部变量,外部不可访问内部变量;全局变量在浏览器挂载window、Node.js挂载global;var函数作用域且提升,let/const块级作用域且有暂时性死区;应优先用const/let、显式声明、启用严格模式。

JavaScript中,全局作用域和函数作用域的访问权限遵循“词法作用域”(Lexical Scoping)规则:变量能否被访问,取决于它在代码中定义的位置,而不是执行时的调用位置。简单说,内部作用域能访问外部作用域的变量,但外部不能访问内部定义的变量。
全局作用域可以被所有函数访问
在最外层(不在任何函数内)声明的变量、函数或类,属于全局作用域,在整个脚本生命周期内都可被读取(除非被同名局部变量遮蔽)。
- 浏览器中,全局变量会自动成为window对象的属性(非严格模式下);Node.js中则挂载在global对象上
- 函数内部可以直接使用全局变量,无需特殊语法,例如:function foo() { console.log(globalVar); }
- 若函数内有同名变量(let/const/var),则该全局变量被遮蔽,此时访问的是局部变量
函数作用域只能访问自身及外层作用域的变量
函数内部定义的变量(用let、const或var声明)只在该函数体内有效,外部无法直接访问。
- let和const声明具有块级作用域,但在函数内声明时,其作用域就是整个函数体(即使写在if或for块中)
- var存在变量提升,声明会被提升到函数顶部,但赋值不会;因此可在声明前读取(值为undefined),但不推荐
- 嵌套函数能形成闭包,可长期持有对外层函数变量的引用,即便外层函数已执行完毕
不同声明方式对作用域行为的影响
声明方式直接影响变量是否进入作用域以及是否可被覆盖:
立即学习“Java免费学习笔记(深入)”;
- var:函数作用域,允许重复声明,存在变量提升,无暂时性死区
- let/const:块级作用域(在函数中即函数作用域),禁止重复声明,存在暂时性死区(TDZ),未声明前访问报ReferenceError
- 不使用关键字直接赋值(如x = 10):在非严格模式下会隐式创建全局变量;严格模式下直接报错
避免意外污染与访问错误的实用建议
清晰的作用域边界是写出可维护代码的基础:
- 优先使用const,仅在需要重新赋值时用let,避免var
- 不要依赖隐式全局变量,所有变量都应显式声明
- 函数参数和内部变量名尽量避免与全局变量重名,防止遮蔽和调试困难
- 用"use strict"开启严格模式,让未声明变量赋值立即报错,提前暴露问题










