全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-16 8 分钟 ✍️ juanwangdev

作用域与变量提升

作用域定义了变量的可访问范围,变量提升影响代码的执行顺序。

作用域类型

全局作用域

在代码任何地方都可访问:

JavaScript
var globalVar = 'global';

function test() {
  console.log(globalVar);  // global
}

函数作用域

只在函数内部可访问:

JavaScript
function test() {
  var localVar = 'local';
  console.log(localVar);  // local
}
console.log(localVar);  // ReferenceError

块级作用域

letconst 声明的变量具有块级作用域:

JavaScript
if (true) {
  let blockVar = 'block';
  const blockConst = 'block';
}
console.log(blockVar);    // ReferenceError
console.log(blockConst);  // ReferenceError

var、let、const对比

特性varletconst
作用域函数作用域块级作用域块级作用域
变量提升是(值为undefined)是(TDZ)是(TDZ)
重复声明允许不允许不允许
重新赋值允许允许不允许

变量提升

var声明提升

声明提升到作用域顶部,值为 undefined

JavaScript
console.log(a);  // undefined
var a = 1;
console.log(a);  // 1

// 等价于
var a;
console.log(a);  // undefined
a = 1;
console.log(a);  // 1

函数声明提升

整个函数定义提升:

JavaScript
sayHello();  // Hello

function sayHello() {
  console.log('Hello');
}

函数表达式不提升

JavaScript
sayHi();  // TypeError: Cannot read property 'sayHi' of undefined

var sayHi = function() {
  console.log('Hi');
};

暂时性死区(TDZ)

letconst 在声明前存在暂时性死区:

JavaScript
console.log(a);  // ReferenceError: Cannot access 'a' before initialization
let a = 1;

TDZ从作用域开始到变量声明:

JavaScript
{
  // TDZ开始
  console.log(a);  // ReferenceError
  let a = 1;       // TDZ结束
}

作用域链

内部作用域可访问外部作用域的变量:

JavaScript
let global = 'global';

function outer() {
  let outer = 'outer';

  function inner() {
    let inner = 'inner';
    console.log(inner);   // inner
    console.log(outer);   // outer
    console.log(global);  // global
  }

  inner();
}

outer();

查找顺序:当前作用域 → 外层作用域 → ... → 全局作用域

常见问题

循环中的var

JavaScript
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出: 3, 3, 3

// 使用let解决
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出: 0, 1, 2

全局变量污染

JavaScript
// 避免使用var创建全局变量
var name = 'Tom';  // 成为window.name

// 使用let或const
const name = 'Tom';  // 不会污染全局

要点总结

  1. var 是函数作用域,let/const 是块级作用域
  2. var 声明提升值为 undefined,函数声明整体提升
  3. let/const 存在暂时性死区(TDZ),声明前不可访问
  4. 作用域链由内向外查找变量
  5. 优先使用 const,其次 let,避免 var

📝 发现内容有误?点击此处直接编辑

← 上一篇 常见事件类型
下一篇 → 函数定义与调用
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库