zoukankan      html  css  js  c++  java
  • ES6 let命令

    我们都知道JavaScript分三部分组成,分别是:ECMAScript(核心)、DOM(文档对象模型)、BOM(浏览器对象模型)。后面我们就说说关于ECMAScript的知识。

    有时候我们会在一些招聘简章上写着那样的一些要求——熟悉ES6。

    那什么是ES6?

    ES6是ECMAScript 6.0的简称,它是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

    ES6新增指令——let

    1.块级作用域

    我们知道JavaScript是没有块级作用域这个概念的,而let指令的出现恰好弥补了这一点。

    块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。

    let块级作用域的体现

    //案例一

    {
     var a=56;
     let b=30;
     }
     console.log(a);//56
     console.log(b);//报错

    //案例2

    //var 情况
     var a=[];
     for(var i=0;i<10;i++){
     a[i]=function(){
     console.log(i);//10
     };
     }
     a[6]();      //函数调用 ,a[6]=function(){console.log(i)};根据作用域链向上寻找,找到全局变量i
     

    //let情况

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

    从案例一我们知道 var声明的变量由于不存在块级作用域所以可以在全局环境中调用,而let声明的变量由于存在块级作用域所以不能在全局环境中调用。

    案例二粗浅理解,若有误请大佬指点

    在var 情况 ,var 声明的变量,全局范围内有效,每次循环i发生改变,重新赋给函数内部的console.log(i);直到循环结束,输出结果10

    在let情况,

    从闭包方向去理解。循环过程如下。
     第一次:
     {
     let i=0;//let使for循环为块级作用域
     b[0]=function(){
     console.log(i)
     };      //注意:由于循环时,let声明i,所以整个块是块级作用域,那么a[0]这个函数就成了一个闭包
     }//闭包b[0]
    第二次:
     {
     let i=1; //注意:因为let i=1; 和 上面的let i=0;出在不同的作用域中,所以两者不会相互影响。不覆盖
     b[1]=function(){
     console.log(i)
     };
     }
     依次循环,直到i=10不满足不执行;
     a[6]();//调用a[6]()函数,这时执行环境随即进入下面这个代码块中的执行环境:funcion(){console.log(i)};输出结果为6;

           //案例3
          //解析:for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
            for(let h=0;h<3;h++){
                 let h='abc';
                console.log(h);
            }

    输出结果:

       //案例3
    for(var h=0;h<3;h++){
    console.log(a);
    var a='abc';
    console.log(h);
    }

     输出结果:

    2不存在变量提升

    我们在预解析的学习过程中知道,var命令会发生“变量提升”现象,即var定义变量先使用后声明,值为undefined。而let定义变量:只可先声明,后使用。

    //var 的情况
       console.log(foo);//underfined
       var foo=2;
      
    //   let 的情况
       console.log(bar);//报错
      let bar=2;

    3 暂时性死区

    暂时性死区即:只要一进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

    if(true){
                tmp='abc';
                 console.log(tmp);//报错 
    // 在let命令声明变量tmp前,都属于死区
    //
    在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
    let tmp; console.log(tmp);//undefined tmp=123; console.log(tmp);//123 }

    注:上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。

    在ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

    4.不允许重复声明

    function func (){
            let b=100;
            var b=10;
        }
    
        function add(num){
            let num;
            return num+1;
        }
    
        function another(){
            let a=10;
            let a=5;
        }

    以上几种均为报错。

    注意:第二个函数,虽然我们没有明确的声明,但是参数实际上是相当于用var声明的局部变量。

  • 相关阅读:
    B
    A
    【转】通过身边小事解释机器学习是什么?
    【转】什么是无监督学习?
    机器学习中的监督学习和无监督学习
    经典传染病传播模型
    复杂网络的主要研究内容
    网络科学导论【第一章】读书脑图
    无标度网络模型
    小世界网络模型
  • 原文地址:https://www.cnblogs.com/smile-xin/p/11399345.html
Copyright © 2011-2022 走看看