Let 、Const 、Var
let | const | var | |
---|---|---|---|
变量提升 | ❌ | ❌ | ✅ |
暂时性死区 | ✅ | ✅ | ❌ |
重复声明 | ✅ | ❌ |
变量提升(var 特有的)
现象: 变量可以在声明之前使用,值为
undefined
。
// var
function fn() {
console.log(name);
var name = '小红';
console.log(name);
var name = '小白';
console.log(name);
}
fn();
// undefined 小红 小白
// let
function fn() {
console.log(name);
var name = '小红';
console.log(name);
let name = '小白';
console.log(name);
}
fn();
// SyntaxError: Identifier 'name' has already been declared
// const
function fn() {
console.log(name);
var name = '小红';
console.log(name);
const name = '小白';
console.log(name);
}
fn();
// SyntaxError: Identifier 'name' has already been declared
暂时性死区
let const 声明的变量,绑定块级作用域,在当前块级作用域内 let/const 声明之前都是死区。
typeof 的结果是 ReferenceError
typeof 没有声明的变量结果是 undefined
// var
var name = '小白';
function main() {
console.log(name);
var name = '小红';
}
main();
// 小白
// let
var name = '小白';
function main() {
console.log(name);
let name = '小红';
}
main();
// ReferenceError: Cannot access 'name' before initialization
// const
var name = '小白';
function main() {
console.log(name);
const name = '小红';
}
main();
// ReferenceError: Cannot access 'name' before initialization