在 JavaScript 中,varletconst都是用来声明变量的关键字,但它们的作用域、提升行为、是否可重新赋值、是否必须初始化等方面有明显差异。下面从核心维度进行对比说明。


一、核心区别速览

特性

var

let

const

作用域

函数作用域

块级作用域

块级作用域

变量提升

✅ 有(初始化为 undefined

✅ 有(但存在 TDZ)

✅ 有(但存在 TDZ)

是否可重复声明

✅ 允许

❌ 不允许

❌ 不允许

是否可重新赋值

✅ 可以

✅ 可以

❌ 不可以

是否必须初始化

❌ 不需要

❌ 不需要

✅ 必须

全局声明是否挂载到 window

✅ 是

❌ 否

❌ 否


二、作用域差异(最关键)

1️⃣ var—— 函数作用域

function test() {
  if (true) {
    var a = 10;
  }
  console.log(a); // 10
}

var没有块级作用域,只在函数内有效。


2️⃣ let / const—— 块级作用域

if (true) {
  let b = 20;
  const c = 30;
}
console.log(b); // ❌ ReferenceError
console.log(c); // ❌ ReferenceError

✅ 在 {}forif中声明的变量,外部无法访问


三、变量提升 & 暂时性死区(TDZ)

var

console.log(x); // undefined
var x = 5;

let / const

console.log(y); // ❌ ReferenceError
let y = 5;

原因:

let / const存在暂时性死区(TDZ)

变量在声明前不可访问


四、重复声明

var a = 1;
var a = 2; // ✅

let b = 1;
let b = 2; // ❌ SyntaxError

const c = 1;
const c = 2; // ❌ SyntaxError

五、重新赋值

var x = 1;
x = 2; // ✅

let y = 1;
y = 2; // ✅

const z = 1;
z = 2; // ❌ TypeError

⚠️ 注意

const只是“不能重新赋值”,不是“不能修改对象内容”。

const obj = { name: 'JS' };
obj.name = 'JavaScript'; // ✅
obj = {};               // ❌

六、全局作用域下的差异

在浏览器中:

var a = 1;
let b = 2;
const c = 3;

window.a; // 1
window.b; // undefined
window.c; // undefined

七、最佳实践建议 ✅

优先使用 const

需要重新赋值时用 let

避免使用 var(除非维护老代码)

// 推荐写法
const API_URL = 'https://api.example.com';
let count = 0;

八、一句话总结

**var是旧时代的函数作用域变量;

let是可变的块级变量;

const是不可变的块级常量。**

更多推荐