Skip to content

var, let, const 区别

先说结论

  • var 声明是全局作用域或函数作用域,而 let 和 const 是块作用域。
  • var 变量可以在其范围内更新和重新声明; let 变量可以被更新但不能重新声明; const 变量既不能更新也不能重新声明。
  • 它们都被提升到其作用域的顶端。 但是,虽然使用变量 undefined 初始化了 var 变量,但未初始化 let 和 const 变量。
  • 尽管可以在不初始化的情况下声明 var 和 let,但是在声明期间必须初始化 const。

1. var

1.当在最外层函数的外部声明 var 变量时,作用域是全局的。

2.var 变量可以重新声明和修改。

js
var greeter = "hey hi";
var greeter = "say Hello instead";

由于可以重新声明, 所以会有个问题:

js
var greeter = "hey hi";
var times = 4;
if (times > 3) {
  var greeter = "say Hello instead";
}
// 修改了外部的 greeter
console.log(greeter); // "say Hello instead"

3.var 的变量提升

js
console.log(greeter);
var greeter = "say hello";

被解释成

js
var greeter;
console.log(greeter); // greeter is undefined
greeter = "say hello";

2. let

1.let 是块级作用域 块是由 {} 界定的代码块,大括号中有一个块

2.let 可以被修改但是不能被重新声明

js
let greeting = "say Hi";
let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared

3.let 的变量提升

  • 用 var 声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化。
  • 用 let 声明的变量会被提升到其作用域的顶部,不会对值进行初始化
js
/*
Uncaught ReferenceError: Cannot access 'foo' before initialization
    at test.html:13
*/
console.log(foo);
let foo;

3. const

1.const 声明的变量在块级作用域内 2.const 不能被修改并且不能被重新声明

js
// Uncaught TypeError: Assignment to constant variable.
const a = 1;
a = 2;
js
// Uncaught SyntaxError: Identifier 'a' has already been declared
const a = 1;
const a = 2;

3.const 声明期间必须初始化值

js
// Uncaught SyntaxError: Missing initializer in const declaration
const foo;
console.log(foo);