• ES6小实验-let和const


    一直想着写点东西把博客装满,但却不知道该写什么,一方面是觉得别人的博客写的已经足够好了,自己没必要写那些重复的东西,另一方面主要还是懒吧。现在却发现似乎有必要写点了,一是为了加深记忆,二也算我曾经飞过这片天空。虽然对别人来说是重复的东西,但对自己却是一个很好的总结。所以应该坚持写东西,坚持总结。今天就从ES6开始吧:

    阮一峰大神写的ECMAScript 6入门写的已经足够详细,以下算是我自己看书的一些小实验吧。他首先介绍了ES6的let命令

    1.let命令只在所在的代码块内有效。为此他提供了两个小例子:

    第一个例子:

    {
       let a = 10
       var b = 1      
    }
    
    console.log(a)//Uncaught ReferenceError: a is not defined
    console.log(b)//1

    从这里可以很明显的看出let声明的变量在代码块外部已经无效,但是var声明的变量在代码块外面依然有效。

    第二个例子:

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

    这个例子中变量i是用let声明的,假如是用var声明的话,最后输出结果就会变为10,原因是:变量 i 是 var 声明的,在全局范围内都有效。所以每一次循环,新的 i 值都会覆盖旧值,导致最后输出的是最后一轮的 i 的值。而使用 let声明的变量仅在块级作用域内有效,不会覆盖旧值,所以最后输出的是 6 。用babel把它转化为ES5可以更清楚的看出差距:

    "use strict";
    
    var a = [];
    
    var _loop = function _loop(i) {
      a[i] = function () {
        console.log(i);
      };
    };
    
    for (var i = 0; i < 10; i++) {
      _loop(i);
    }
    a[6](); //6

    2.不存在变量提升

    所谓变量提升就是变量可以先使用,然后再声明。var声明的变量是可以先使用后声明的,例如:

    console.log(a)// undefined
    console.log(b)// b is not defined
    var a = 6
    let b = 8

    浏览器输出 undefined,没有报错。但如果用let声明的话会报错,所以在使用let声明的变量时,应该先声明在使用。

    3.暂时性死区

    我对它的理解是:只要块级作用域里面存在了一个let a ; 那么这个作用域的a变量就控制了这个区域,不管外面风云变幻,块内都稳如泰山,有点像当第一个精子进入了卵子后,卵子就屏蔽了其他精子的进入一样,要强行进入的话就会报错。举例:

    var tmp = 123
    if(true) {
        tmp = "abc"
        let tmp  = "go"
        console.log(tmp)//Uncaught ReferenceError: tmp is not defined
    }

    4.不允许重复声明

    let 不允许在相同作用域内,重复声明同一个变量。这个简单,举例:

    {
        let a = 10
        var a = 1
    }//Uncaught SyntaxError: Identifier 'a' has already been declared

    如果没有let的话,是可以重复声明同一个变量的,

    {
        var a = 10
        var a = 1
        console.log(a)//1
    }

    这节就暂时写到这吧。

     

  • 相关阅读:
    java中sleep()和wait()区别
    那些年遇到的坑--------“集合转数组”
    HashMap中推荐使用entrySet方式遍历Map类集合KV而不是keySet方式遍历
    java.util.ConcurrentModificationException 异常原因和解决方法
    java.lang.Exception: No tests found matching
    https和http的主要区别
    交换性别sql
    判断奇偶数
    Jmeter安装使用
    java.io.EOFException: Unexpected EOF read on the socket
  • 原文地址:https://www.cnblogs.com/fengz/p/6658670.html
Copyright © 2020-2023  润新知