let命令的语法

1.基本用法

let的用法与var基本类似,但仅在其声明的代码块内作用

    {
        var a = 123;
        let b = 456;
    }
    console.log(a);
    console.log(b); //ReferenceError: b is not defined

同理,在循环语句里也可以体现

    for(var i = 0; i < 4; i++){
    }
    for(let j = 0; j < 5; j++){
    }
    console.log(i); //4
    console.log(j); //ReferenceError: j is not defined

2.不存在变量提升

可以理解为var的镜面效果。由let声明的变量不能在该变量声明之前使用,否则会报错。而由var声明的变量可以提前使用,但值为undefined。关于“什么是变量提升”可以查看上一篇文章。

    console.log(b);
    let b = 2;  //ReferenceError: Cannot access 'b' before initialization

    console.log(a); //undefined
    var a = 1;

3.暂时性死区

在一个代码块中,由let声明的变量,在其声明之前该变量是不能使用的。这个区块对这些let声明的变量,从一开始就形成了封闭作用域。而这个封闭作用域就是“暂时性死区(temporal dead zone,简称 TDZ)”

    if(true){
        //TDZ开始
        a = 1;  //ReferenceError: Cannot access 'a' before initialization
        console.log(a); //ReferenceError: Cannot access 'a' before initialization

        let a; //TDZ结束
        console.log(a); //undefined

        a = 2;
        console.log(a); //2
    }

4.不允许重复声明

    if(true){
        var a;  //SyntaxError: Identifier 'a' has already been declared
        let a;
    }
    if(true){
        let a;  //SyntaxError: Identifier 'a' has already been declared
        let a;
    }
    function fun(a){
        let a;  //SyntaxError: Identifier 'a' has already been declared
    }
    fun();


版权声明:本文为qq_40349011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。