js中多let与var
在 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