JavaScript作用域分为全局、函数、块级三层,呈嵌套收窄结构:全局作用域在脚本顶层声明变量(var挂window,let/const不挂);函数作用域仅var专属,无视{};块级作用域由{}划定,仅let/const受约束。

JavaScript 中作用域的区分,核心看变量声明位置和所用关键字。全局作用域最宽,函数作用域次之,块级作用域最细——三者不是并列关系,而是层层嵌套、逐步收窄的结构。
全局作用域:整个脚本或浏览器 window 级别
在任何函数或代码块外部直接声明的变量(var、let、const)都属于全局作用域;未声明直接赋值的变量也自动挂载到全局对象(如浏览器中是 window)。
-
var a = 1;、let b = 2;、const c = 3;写在最外层,三者都可在任意地方访问(let/const在模块顶层不挂 window,但仍是全局作用域) - 注意:
let和const声明的全局变量不会成为window的属性,而var会(如window.a存在) - 避免污染:尽量不用多个
var全局变量,推荐用单个命名空间对象封装
函数作用域:仅限 function 内部,var 的专属领地
只有用 var 声明的变量才具有纯粹的函数作用域——它无视 {},只要在某个函数内声明,整个函数体都可访问;函数执行结束,该作用域销毁。
if (true) { var x = 10; } console.log(x); // 10 → x 被提升并作用于整个函数</li> <li>函数内部可访问外部(包括全局)变量,但外部无法访问函数内 <code>var变量-
let和const在函数内声明,仍遵循块级规则,不被函数作用域“兜底”
块级作用域:由 {} 划定,let/const 的主场
凡是用大括号包裹的区域——if、for、while、switch 或纯 {...}——都是块级作用域。只有 let 和 const 声明的变量受其约束,var 完全无视。
立即学习“Java免费学习笔记(深入)”;
{ let y = 20; const z = 30; } console.log(y); // ReferenceError</li> <li><code>for (let i = 0; i < 3; i++) {} console.log(i); // ReferenceError</li> <li>块级作用域可嵌套,内层可访问外层变量,但外层不可访问内层变量</li> </ul> <H3>作用域嵌套与查找:从内向外逐层向上找</H3> <p>当访问一个变量时,JS 引擎按「当前块 → 外层函数 → 全局」顺序查找,直到找到第一个匹配声明。这个链条就是作用域链。</p> <ul> <li>同名变量在不同作用域中互不影响:<code>let x = 100;在全局,function f() { let x = 200; console.log(x); }输出 200- 函数内部未用
let/const/var声明就赋值,会隐式创建全局变量(严格模式下报错) - 函数参数也属于函数作用域,且优先级高于同名外部变量


















