Let 、Const 、Var

letconstvar
变量提升
暂时性死区
重复声明

变量提升(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