作用域(Scope)是一组规则,决定了你的变量住在哪里以及在哪里可以访问它们。提升(Hoisting)是引擎在运行代码之前如何组织它们。
单向镜比喻
把作用域想象成 贴膜的车窗:
• 从里向外: 如果你在车里(函数作用域),你可以看到外面的一切(全局作用域)。
• 从外向里: 如果你在外面,你看不到车里发生了什么。里面的变量是私有的。
作用域链
当你使用一个变量时,JavaScript 会在当前房间寻找它。如果不在那里,它会去外面的房间找。它一直往上找,直到碰到全局作用域。
javascript
const globalUser = "Admin";
function outer() {
const outerVar = "我在中间";
function inner() {
const innerVar = "我在深处";
// 1. 在 'inner' 中找?不。
// 2. 在 'outer' 中找?是的!找到了。
console.log(outerVar);
// 1. 在 'inner' 中找?不。
// 2. 在 'outer' 中找?不。
// 3. 在全局中找?是的!
console.log(globalUser);
}
inner();
}
outer();提升: "幽灵" 变量
提升不是魔法;它是编译器在执行代码之前做“第一遍”,找到所有的变量声明。
提升期间的变量行为
function:完全提升。你可以在定义它们之前调用它们。var:提升但初始化为undefined。let / const:提升但放置在 暂时性死区 (TDZ) 中。触摸它们会使应用程序崩溃。
javascript
// 1. 函数可以安全地提前使用
sayHello();
function sayHello() {
console.log("我能工作因为我被提升了!");
}
// 2. Var 是危险的
console.log(myVar); // undefined (不是错误,只是空的)
var myVar = 10;
// 3. Let/Const 会爆炸
try {
console.log(myLet);
} catch(e) {
console.error("TDZ 错误:", e.message);
}
let myLet = 20;