zoukankan      html  css  js  c++  java
  • let 的含义,及let 与 var 的区别

    1. let 声明的变量,只在他所在的代码模块下有效;

    for( let i=0;i<10;i++ ){

      console.log(i);                // 0--9

    }

    console.log(i);                         // i 未定义

    上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。如下var代码:


    //------------------------------------------------------

    2.   var a=[];

          for(var i=0;i<10;i++){

        a[i]=function(){

          console.log(i);

        }

          }

         a[1]();                      //10

         

    变量i是var声明的,在全局范围内都有效,所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮i的值。

    //----------------------------------------------------------------------------------------------------------------------------------

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

    //使用 let,声明的变量仅在块级作用域内有效;
    //----------------------------------------------------------------------------------
    2. 不存在变量提升
    let不会像 var 那样发生 “变量提升”,变量需要先声明然后再使用,否则会报错;
    var 的情况
    console.log(aaa); //undefined;
    var aaa="aaa";


    let情况
    console.log(bbb); //报错 bbb is not defined
    let bbb = "bbb";

    let bbb = "bbb";
    console.log(bbb); //bbb

    3. 暂时性死区
    块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响;
    var tmp = 123;
    if(true){
    tmp = 'abc';
    // console.log(tmp); //abc
    let tmp;
    console.log(tmp); //tmp is not defined
    }
    //

     上面代码定于全局变量tmp,但是在快级作用域内let又声明了一个局部变量tmp,导致绑定了这个快级作用域;因此打印出tmp会报错。

      

    4. 不允许重复声明
    let 不允许在相同作用域内 重复声明同一个变量,会报错
    function a(){
    let a = 10;
    var a = 1;
    console.log(a);
    }
    a(); //报错 Identifier 'a1' has already been declared

    function a(){
    let a1 = 10;
    let a1 = 1;
    console.log(a1);
    }
    a(); // Identifier 'a1' has already been declared
    //--------------------------------------------------------------------------------
    //也不能在函数内部重新声明参数
    // function fun1(arg){
    // let arg;
    // }
    // fun1(); //Identifier 'arg' has already been declared

    function fun2(arg){
    {
    let arg;
    }
    }
    fun2(); //不报错
    //-----------------------------------------------------
    ES6 的块级作用域
    function f1(){
    let n=5;
    if(true){
    let n = 10;
    }
    console.log(n); //5 外层代码不受 内层代码影响;
    }
    f1();

    function f2(){
    var n = 5;
    if(true){
    var n=10;
    }
    console.log(n); //10
    }
    f2();



  • 相关阅读:
    Excel 向程序发送命令时出现问题
    JavaScript中undefined,null,NaN的区别
    MYSQL查询优化(一)
    win7 去除任务栏上出现的过期图标
    InnoDB与MyISAM区别
    form表单 按回车自动提交 实现方式
    多线程下载图片
    MySQL启动不了,InnoDB: autoextending data file .\ibdata1 is of a different size 78592 pages (rounded down to MB) than specified in the .cnf file: initial 131072 pages, max 0 (relevant if nonzero) pages!
    Net EF to MySQL生成edmx文件时报错:StrongTypingException:表“TableDetails"中列“IsPrimaryKey"的值为DBNull
    DataTable转置
  • 原文地址:https://www.cnblogs.com/nnf-888/p/8423420.html
Copyright © 2011-2022 走看看