在 JavaScript 中,let 和 var 都用于声明变量,但它们有一些关键的区别。主要区别包括作用域、变量提升、可重复声明、以及在全局作用域中的行为。
1. 作用域(Scope)
-
let:块级作用域。用let声明的变量只在其所在的代码块{ ... }中有效。{ let x = 10; } console.log(x); // ReferenceError: x is not defined -
var:函数级作用域。用var声明的变量在函数内可用,但如果在函数外声明,则它是全局变量。{ var y = 20; } console.log(y); // 20
2. 变量提升(Hoisting)
-
let:存在"暂时性死区"(Temporal Dead Zone),即变量在声明前不能访问。虽然在内存中存在,但访问会导致错误。console.log(a); // ReferenceError: Cannot access 'a' before initialization let a = 5; -
var:会被提升至作用域顶部,因此可以在声明之前访问,但值为undefined。console.log(b); // undefined var b = 5;
3. 重复声明(Redeclaration)
-
let:在同一作用域内不允许重复声明同一变量。let c = 1; let c = 2; // SyntaxError: Identifier 'c' has already been declared -
var:允许在同一作用域内重复声明。var d = 1; var d = 2; // No error, d is now 2
4. 全局作用域中的行为
-
let:在全局作用域中声明时不会成为window对象的属性。let e = 10; console.log(window.e); // undefined -
var:在全局作用域中声明时会成为window对象的属性。var f = 10; console.log(window.f); // 10 -
