const 和 let俩儿哥们
const 与 let 易错点
GJ504b最近要考web期末了,总结一下const 与 let
let:
暂时性死区
变量在声明前无法访问,用typeof也报错
console.log(num); // 报错:ReferenceError(num未声明)
let num = 10;
块级作用域边界
let 声明的变量仅在当前代码块({} 包裹的区域)内有效,跨块访问会报错。
if (true) {
let x = 10;
}
console.log(x); // 报错:x未定义
不可重复声明
同一作用域内,let 变量不能与 var、let、const 重复声明同名变量
let a = 10;
let a = 20; // 报错:标识符a已声明
const:
必须立即初始化
声明时必须赋值,否则报错
const PI; // 报错:未初始化
const PI = 3.14; // 正确
“不可变”的误解
- 基本类型:值不可变,重新赋值报错
const num = 10;
num = 20; // 报错:Assignment to constant variable
- 引用类型:变量储存地址不可变,对象/数组的内容可以修改
const obj = { name: '张三' };
obj.name = '李四'; // 允许(修改对象属性,地址未变)
obj = { name: '王五' }; // 报错(重新赋值,地址改变)
作用域重复声明
const 声明的变量仅在当前代码块({} 包裹的区域)内有效,跨块访问会报错。
if (true) {
const x = 10;
}
console.log(x); // 报错:x未定义
和var区别
- let/const 声明的全局变量不属于 window 对象(var 声明的全局变量属于 window)
let a = 10;
console.log(window.a); // undefined(let声明)
var b = 20;
console.log(window.b); // 20(var声明)
- let 在 for 循环中为每次迭代创建独立作用域,var 则共享作用域(易引发闭包陷阱)。
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0); // 输出 0,1,2(每次迭代独立i)
}
for (var j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 0); // 输出 3,3,3(共享j,最终值为3)
}

浙公网安备 33010602011771号