javaScript作用域 是变量和函数可访问的范围,分为全局、函数和块级三种;全局变量 在脚本顶层声明,函数作用域由 var 定义,块级作用域由 let/const在 {} 中定义;作用域链支持内层访问外层变量。

javascript 的 作用域,简单说就是变量和函数能被访问的“地盘”。它不是运行时才决定的,而是在代码写好、函数定义那一刻就固定下来的(这叫词法作用域)。理解作用域,关键看变量在哪声明、用什么关键字声明、以及被包裹在什么结构里。
全局作用域:整个脚本都认得它
在 <script></script> 标签最外层、或独立 .js 文件的顶层直接声明的变量(比如用 var、let、const),就属于全局作用域。它们可以在任何地方被读取(除非被同名 局部变量 遮蔽)。
-
var a = 10;和let b = 20;写在函数外面 → 全局可访问 - 函数内部没声明就直接赋值,如
c = 30;→ 自动挂到window(浏览器 )或global(node.js)上,也变成全局(但 强烈不推荐) - 全局变量生命周期贯穿整个页面 / 进程,容易造成命名污染和意外覆盖
函数作用域:函数内部自成一派
在函数体内用 var 声明的变量,只在该函数内有效;函数执行完,这个作用域通常就销毁了(闭包 例外)。
- 不同函数之间的
var变量互不可见,哪怕名字一样 - 函数内可以访问外部(包括全局)的变量,但外部看不到函数内的
var -
function fn() { var x = 5;}→x在fn外调用会报ReferenceError
块级作用域:es6 起由 let 和 const 划出的小圈子
用 {} 包裹的代码块(如 if、for、纯 {})中,用 let 或 const 声明的变量,只在该块内有效。
立即学习“Java 免费学习笔记(深入)”;
-
if (true) {let y = 100;}→y在if外无法访问 -
var在块中声明仍属于函数或全局作用域,不会产生块级限制 - 同一块内重复用
let声明同名变量会报错,var则允许(只是覆盖)
作用域链:一层层往上找变量的路线图
当访问一个变量时,JS 引擎先在当前作用域找;找不到就往它的外层作用域找,一直追到全局作用域为止。这就是作用域链。
- 内层函数可以访问外层函数的变量(闭包的基础)
- 但外层函数永远访问不到内层函数用
let或var声明的变量 - 如果内外层有同名变量,就近原则:当前作用域的变量会“遮蔽”外层的同名变量