• ES6新增关键字let与var的区别


    最近看了很多文章,偶然间看到ES6中新增了一个关键字 let ,它具有与 var 关键字相似的功能。一开始使用它时,发现它让我对之前一些习以为常的东西产生了怀疑。

     

    下面先让我们看看它和 var 之间用法的不同

     {

       var a = 10;

       let b = 8;

     }

       a  //10 

       b  // Referenceerror :b is not defined

    上面在代码块中声明了两个变量并分别赋值输出到控制台,结果a的变量成功输出,b的输出结果产生了报错。可见,let声明的变量只在它所在的代码块中产生作用。同时,我们也能想到它最好的使用方法就是在for循环中使用。

     

    下面我们再举个例子来观察它与 var 之间的区别:

      var a = [ ]

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

        a[i] = function(){

          console.log(i);

        }

      }

      console.log("i的值:",i);

      a[ 4 ]( );

     

     

      它的输出结果为:

     

        i 的值:6

        6

     

      为什么是 6 呢?一开始我也被吓懵逼了,这有悖于我的常识,以往没注意到的地方,居然这么的low。在我的意识里结果应该 4,而不是 6 。我想了很久也想不明白,以我这种小白的技术,自然是很难搞懂这种资深技术宅的问题。所以,我查了很多资料来解决这个问题,才搞明白。

      在for里用 var 声明的 i 是全局变量,在循环外部也可以访问到,在循环体内每次循环都给 i 重新赋一次值,而 i 却是属于全局的,外部的 i 值最终是 6 ,数组 a[ ]指向的 i 始终都是同一个 i,当循环结束时 a [ ] 函数内部的 i 就是最终 i 的结果  6。

     

      如果使用let,声明的变量只在当前代码块中起作用

        

      var a = [ ]

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

        a[i] = function(){

          console.log(i);

        }

      }

      console.log("i的值:",i);

      a[ 4 ]( );

     

     它的输出结果为:

     

        i 的值:6

        4

     

      上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是4。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。

  • 相关阅读:
    Binary Tree Maximum Path Sum
    ZigZag Conversion
    Longest Common Prefix
    Reverse Linked List II
    Populating Next Right Pointers in Each Node
    Populating Next Right Pointers in Each Node II
    Rotate List
    Path Sum II
    [Leetcode]-- Gray Code
    Subsets II
  • 原文地址:https://www.cnblogs.com/bigharbour/p/11399263.html
Copyright © 2020-2023  润新知