美文网首页
let - 学习笔记

let - 学习笔记

作者: 隋晓楠 | 来源:发表于2019-04-13 14:23 被阅读0次

    一、let声明的变量,仅在代码块内有效

    下述代码中i为var声明,为全局作用域

    var a = [];
    for (var i = 0; i<10; i++){
        a[i]=function(){
            console.log(i)
        }
    }
    a[5](); //10
    

    下列代码中let仅在块状作用域内有效

    var a = [];
    for (let i = 0; i < 10; i ++){
        a[i] = function(){
            console.log(i)
        }
    }
    
    a[5](); //5
    

    for循环还有一个特别之处,就是设置循环变量的那个部分是一个父级作用域,而循环体内部是一个单独的自作用域。

    for (let i = 0; i < 3; i++){
        let i = 'abc';
        console.log(i);
    }
    // 输出如下:
    // abc
    // abc
    // abc
    

    二、let声明的变量,不存在变量提升

    console.log(test); //undefined
    var test = 1;
    
    console.log(test1) // Uncaught ReferenceError: test1 is not defined
    let test1 = 1; 
    

    三、暂时性死区

    只要块级作用域内存在let命令,他所生命的变量就“绑定”这个区域,不在受外部影响,不会再去寻找上一级作用域是否定义了该变量。以下代码中,let命令声明test3之前,都属于变量test3 的死区。

    if (true){
        //TDZ开始
        test3 = 'abc'; // Uncaught ReferenceError: test3 is not defined
        console.log(test3);//Uncaught ReferenceError: test3 is not defined
    
        let test3; //TDZ结束
        console.log(test3); //undefined
    
        test3 = 123;
        console.log(123); //123
    }
    

    四、不允许重复声明

    let不允许在相同作用域内声明同一个变量

    //报错
    function abc() {
        let a = 10;
        var a = 1;
    }
    
    //报错
    function abc() {
        let a = 10;
        let a = 1;
    }
    
    //报错
    function abc(arg) {
        let arg;
        let a = 1;
    }
    
    //不报错
    function abc(arg) {
        {
            let arg;
        }
        let a = 1;
    }
    

    五、let、const、class声明的全局变量不再属于顶层对象(window、global)属性

    let b = 1;
    window.b //undefined;
    

    本文内容出自:《ES6标准入门》(阮一峰著)

    相关文章

      网友评论

          本文标题:let - 学习笔记

          本文链接:https://www.haomeiwen.com/subject/tpclwqtx.html