5月27日 01:16
var、let、const 之间的区别是什么?
三个维度的区别:
作用域:var 是函数作用域,let/const 是块级作用域。{ } 内部用 let 声明的变量,括号外访问不到。
变量提升:var 有提升且初始化为 undefined(声明前访问得到 undefined)。let/const 也有提升但存在暂时性死区(TDZ)——声明前访问直接 ReferenceError。
重复声明:var 可重复声明(后覆盖前),let/const 在同一作用域不能重复声明。
const 额外特性:声明时必须初始化,且不能重新赋值。但对象和数组的属性可以修改(const 锁的是绑定,不是值)。
javascript// var:函数作用域,讨厌的经典 bug for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i)); // 3 3 3 } // let:块级作用域,每次迭代创建新绑定 for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i)); // 0 1 2 }
追问
为什么 let 能解决 for 循环的回调/闭包问题?
var 是整个 for 循环共享一个变量,循环结束后 i 是最终值。let 每次循环迭代都会创建一个新的绑定,每个 setTimeout 捕获的 i 是不同的绑定。即使循环结束后,这些绑定的值仍然保留着当时的 i。
const 声明的对象属性为什么可以修改?
const 锁定的是变量名到值的绑定关系——"这个变量名不能指向别的值"。对象属性是变量指向的内存地址内部的变更,不改变绑定关系。