美文网首页
ES基础语法补充(let)二刷 ,每刷一次就有新的理解

ES基础语法补充(let)二刷 ,每刷一次就有新的理解

作者: 吴高亮 | 来源:发表于2018-12-19 21:24 被阅读0次

    首先就是let只在定义的区块中有效;在区块以外无效;同样let无声明提升;
    {
    let a=0;
    var b=1;
    };
    console.log(a);//报错;
    console.log(b);1;
    for循环最适合使用let;
    var a = [];
    for (var i = 0; i < 10; i++) {
    a[i] = function () {
    console.log(i);
    };
    }
    a6; // 10
    代码从上到下执行;var i;相当于全局就一个i;代码从上到下执行;最终执行完成后i就是10;
    var a = [];
    for (let i = 0; i < 10; i++) {
    a[i] = function () {
    console.log(i);
    };
    }
    a6; // 6
    上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
    for (let i = 0; i < 3; i++) {
    let i = 'abc';
    console.log(i);
    }
    // abc
    // abc
    // abc
    for后面的()是一个作用域;内部循环是一个作用域;
    上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。

    • 不存在变量提升;也就是会出现暂时性死区;不允许全局定义;在函数的内部的默认的方法;存在

    为什么需要块级作用域;

    首先内部变量会覆盖外部变量;
    var tmp=new Date();
    function f(){
    console.log(tmp);
    if(false){
    var tmp='hello world';
    }
    };
    f();//undefined;
    因为var 存在变量提升;导致内层的变量tmp被从新定义;一个{};就是一个区块;也就是块级作用域;
    let实际上为JavaScript增加了块级作用域;
    块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。

    相关文章

      网友评论

          本文标题:ES基础语法补充(let)二刷 ,每刷一次就有新的理解

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