全局作用域和局部作用域最核心的区别在于作用范围、生命周期和访问权限:全局变量在整段脚本中均可访问且随页面存在而存续,局部变量仅限声明它的函数或代码块内使用且执行完毕即销毁。

全局作用域和局部作用域最核心的区别在于“谁能在哪儿用、能用多久”。不是看代码写了多少行,而是看变量在哪儿声明、在哪儿能被访问、活到什么时候。
作用范围:能被谁看到?
全局变量一出生就在整个脚本里畅通无阻,任何函数、任何地方都能读写它;局部变量只对它“出生”的那个函数或代码块负责,出了这个{}或函数体,就彻底看不见了。
- 函数内部可以放心读写全局变量,但函数外面绝对访问不到函数内用 let 或 const 声明的变量
- 同名变量可以共存:全局有个 count = 1,函数里再写 let count = 5,两者互不干扰,函数里用的是自己的
- 没加 var/let/const 就直接赋值(比如 name = "Tom"),会悄悄变成全局变量——这不是局部,是“假装局部实则全局”
生命周期:什么时候生、什么时候死?
全局变量从页面打开那一秒就存在,一直到关掉标签页才消失;局部变量是“临时工”:函数开始执行时上岗,函数执行完立刻下班(内存通常可回收)。
- var 声明的函数内变量,属于函数作用域,函数结束就释放
- let/const 声明的变量,严格绑定在块级范围内(比如 if{} 或 for{}),块结束就不可访问
- 闭包是个例外:如果函数返回了一个内部函数,且该内部函数引用了外层的局部变量,那这个局部变量不会销毁,会一直留着——这是机制,不是 bug
内存与安全:为什么不能乱用全局?
全局变量长期占着内存,还容易被不同模块意外改写;局部变量天然隔离,命名不怕重复,也更省资源。
- 全局变量自动挂到 window 上(浏览器环境),let name = "A" 之后 window.name 也能读到(注意:let/const 不可重复声明,但属性仍可读)
- 多个函数都用 var i = 0 做循环计数器,它们其实是同一个变量;换成 let i = 0,每次循环都有独立的 i
- 避免隐式全局:始终用 let 或 const 显式声明,禁用不加关键字的赋值
实际判断小技巧
不用背定义,现场看三件事就行:
- 声明位置:在所有函数外面?→ 很可能是全局;在函数或 {} 里面?→ 局部或块级
- 能否跨函数访问:函数 A 里定义的变量,函数 B 能直接用吗?不能 → 是局部
- 有没有被闭包留住:函数执行完了,还有别的函数在用它?有 → 这个局部变量还在活着
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











