美文网首页
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