函数与逻辑2026年1月21日星期三

作用域与提升

你的变量住在哪里?

广告

查看赞助商以支持 JS Fruggal。

作用域(Scope)是一组规则,决定了你的变量住在哪里以及在哪里可以访问它们。提升(Hoisting)是引擎在运行代码之前如何组织它们。

单向镜比喻

把作用域想象成 贴膜的车窗
从里向外: 如果你在车里(函数作用域),你可以看到外面的一切(全局作用域)。
从外向里: 如果你在外面,你看不到车里发生了什么。里面的变量是私有的。

作用域链

当你使用一个变量时,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) 中。触摸它们会使应用程序崩溃。
// 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;
广告

查看赞助商以支持 JS Fruggal。