JavaScript作用域分为全局、局部和块级三种:全局作用域中变量处处可访问;局部作用域限于函数内部,每次调用新建并销毁;块级作用域由let/const在{}内声明,仅在该代码块有效。
JavaScript 的作用域,简单说就是变量和函数能被访问到的范围。它不是运行时动态决定的,而是在代码写好、函数定义完成时就固定下来的(也就是“词法作用域”)。作用域控制着名字的可见性、生命周期,也避免了不同区域用相同变量名带来的冲突。
在 标签最外层、或独立 JS 文件顶层声明的变量和函数,就属于全局作用域。它们在页面整个生命周期中都存在,任何地方都能读取(包括所有函数内部)。
var a = 10; 写在函数外面 → 全局变量,window.a 也能访问到var/let/const 直接赋值,比如 b = 20; → 自动挂到 window 上,也是全局函数内部用 var、let 或 const 声明的变量,只在该函数体内可访问。每次调用函数,都会新建一个独立的局部作用域,执行完就销毁。
let 和 c
onst
用 {} 包裹的代码块(如 if、for、纯大括号)本身不构成作用域,但用 let 或 const 在其中声明的变量,就只在该块内有效。
if (true) { let x = 1; } console.log(x); // 报错var 在块中声明仍属函数或全局作用域,不会受 {} 限制全局变量生来就“公开”,哪都能用;局部变量是“私有的”,只服务自己所在的函数;而块级变量更“谨慎”,连一个 if 块都不愿跨出去。