作用域回答「这个变量在哪里能被看到」。JS 用词法(静态)作用域:函数能访问哪些变量由它在源代码里的位置决定,与调用位置无关。var 的作用域是「函数级」,大括号挡不住它;let/const 是「块级」——if、for 的大括号都是独立作用域。
作用域链:访问变量时沿「当前作用域 → 外层 → … → 全局」逐层查找,找不到才报 ReferenceError。闭包的本质就是函数记住了它定义时的那条作用域链。理解作用域是理解闭包、this、模块化的共同前提。
var g = '全局'; function outer() { var x = 1; function inner() { console.log(g, x); // 沿作用域链向外找到 outer 的 x 和全局 g } inner(); } outer(); // var 与 let 的作用域差异 function demo() { if (true) { var v = 1; let l = 2; } console.log(v); // 1 —— var 穿透 if 块 console.log(l); // ReferenceError —— let 被块级作用域挡住 }