javascript全局变量指在函数外声明或不声明直接赋值的变量;var声明的挂载到window且有提升,let/const声明的不挂载但不可提升,隐式赋值仅非严格模式允许,模块中顶层声明为模块级作用域。

在 JavaScript 中,全局变量是指在任何函数外部定义、或不使用 var、let、const 声明直接赋值的变量(严格模式下不推荐后者)。它们可在整个脚本甚至多个脚本间被访问。
在全局作用域中用 var 声明
var 声明的变量具有函数作用域和变量提升特性,在全局作用域中声明即成为全局对象(如浏览器中的 window)的属性:
- 在最外层(非函数内)写
var a = 10;,a就是全局变量; - 在浏览器中可通过
window.a访问; - 注意:即使在块(如
if或for)中用var声明,它仍属于外层函数或全局作用域,不会被块级限制。
用 let 和 const 在全局作用域声明
在脚本顶层(模块外)使用 let 或 const 声明的变量也属于全局作用域,但不会挂载到 window 对象上:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 例如:
let b = 20;或const c = 'hello';—— 它们可被全局访问,但window.b是undefined; - 这是 ES6 的设计改进,避免污染全局对象;
- 它们有块级作用域,但在顶层就是全局作用域,且不存在变量提升(会进入“暂时性死区”)。
不声明直接赋值(不推荐)
在非严格模式下,直接写 d = 42;(无关键字)会隐式创建全局变量,并自动绑定到全局对象(如 window.d):
- 严格模式(
'use strict';)下会报错ReferenceError; - 极易引发命名冲突和难以调试的问题;
- 应绝对避免这种方式定义全局变量。
模块环境下的全局变量
在 ES 模块(type="module" 的 script)中,顶层声明(let/const/var)不会成为真正的全局变量,而是模块级作用域:
- 不同模块的同名顶层变量互不影响;
- 若需跨模块共享,应显式导出(
export)并导入(import); - 真正意义上的全局变量仍需挂载到
window(浏览器)或globalThis上,例如:globalThis.myGlobal = 'ok';。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










