const、let 和 var
javascript
// 1. 作用域(Scope)
//var:函数作用域(function-scoped)在函数内部声明的变量**只能**在函数内部访问,否则是全局作用域。
function test() {
var x = 10;
if (true) {
var x = 20; // 同一个变量
console.log(x); // 20
}
console.log(x); // 20(if 块内覆盖了外部的 x)
}
let 和 const:块级作用域(block-scoped)在 {}(如 if、for、函数等代码块)内声明的变量只能在块内访问。
if (true) {
let y = 10;
const z = 20;
console.log(y, z); // 10, 20
}
console.log(y, z); // 报错:y/z 未定义 如果是 var 修饰,就可以访问,因为var 如果在函数内,使用,则 作用域在函数内,其它全部是全局作用域
2. 变量提升(Hoisting)
var:变量会被提升到**作用域顶部(如果函数内,则提升到函数的顶部,其它也是 最顶部)**,但赋值不会。声明前访问会得到 undefined。
let 和 const:存在暂时性死区(Temporal Dead Zone, TDZ)。声明前访问会报错。
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 10;
3. 重复声明
var:无论是相同还是不相同作用域,都允许重复声明,不会报错。
let 和 const:同一作用域内禁止重复声明。不同作用域可以重复声明
4. 值的修改
var 和 let:声明的变量可以重新赋值。
const:声明的是常量,赋值后不能修改(但对象/数组的属性或元素可以修改)。
5. 全局作用域下的行为
var:在全局作用域下声明的变量会成为 window 对象的属性
var h = 10;
console.log(window.h); // 10(浏览器环境)
console.log(h); // 10(浏览器环境) window可以省略
let 和 const:不会成为 window 的属性。
let i = 10;
console.log(window.i); // undefined 因为 window上没有i ,属性,js中一个不存在的属性,则输出 undefined