使用 var 声明的变量具有函数作用域或全局作用域。如果在函数外部声明,则该变量属于全局作用域;如果在函数内部声明,则它仅限于该函数的作用域。
使用 let 或 const 声明的变量则具有块级作用域,这意味着它们只在其声明所在的代码块 {} 内部有效。
functiontestScope(){var a =1;let b =2;const c =3;if(true){var a =4;// 修改的是同一个变量let b =5;// 新的块级作用域变量const c =6;// 新的块级作用域常量
console.log('Inside block:', a, b, c);}
console.log('Outside block:', a, b, c);// 输出: 4, 2, 3}testScope();
// Var allows re-declaration.var x =10;var x =20;// No error.// Let does not allow re-declaration within the same scope.let y =10;let y =20;// SyntaxError: Identifier 'y' has already been declared.// Const also disallows re-declaration and modification of primitive values.const z =10;
z =20;// TypeError: Assignment to constant variable.
3. 提升行为
所有三种方式都会发生变量提升,但只有 var 在提升的同时会被初始化为 undefined,而 let 和 const 则不会自动初始化,因此在访问未初始化之前使用这些变量会导致报错(暂时性死区 TDZ)。
console.log(x);// undefined (变量已提升并初始化)var x =10;
console.log(y);// ReferenceError: Cannot access 'y' before initializationlet y =10;
console.log(z);// ReferenceError: Cannot access 'z' before initializationconst z =10;
4. 生命周期
对于 var 来说,由于它的作用域较大,可能会在整个程序执行期间都保持存活状态,除非离开当前函数上下文。