zoukankan      html  css  js  c++  java
  • ECMAScript6 入门-let与const命令

    块级作用域

      1:let命令声明的变量只在let命令所在的代码块有效--简而言之 大括号既是代码块,也就是说存在块级作用域了.

    {
        let a =10;
        var b =1;
    }
    a // ReferenceError: a is not defined.
    b //1

      重点:所以let命令很适合在for循环当中,并且for循环的设置循环变量的那个区域是个父级作用域,循环体里面是一个子作用域

      注释:下面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6,这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算

    var a = [];
    for (let i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6](); // 6
    //体现功能点:for循环设置循环变量的作用域 与 循环体是不同的作用域
    //for循环变量的作用域是循环体的父级作用域
    for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc

      

    不存在变量提升

      1:只要块级作用域内使用let声明了一个变量,那么这个变量就绑定了这个块级作用域,同时因为let命令声明的变量不会发生变量提升,所以在声明之前使用都会报错,也就表明typeof运算符不再是安全,(ES5当中,未声明的变量采用typeof 的时候显示的是undefined,还有声明了但是没有初始化的变量也是undefined,JS高级编程就提示最好声明的时候初始化)

      注释:暂时性死区(在变量声明之前使用)

    // var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;
    
    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;
    var tmp = 123;
    
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;
    }
    //注释:块级作用域通过let声明了变量tmp,那么在声明之前使用都会报错,而不是调用全局变量
    //注释:在块级作用域当中,如果使用了let或者const定义变量,那么必须在定义之后使用,而不管父级作用域是否存在相同的变量

    不允许重复声明

      1:所以也不能重新声明函数的参数

    // 报错
    function func(arg) {
      let a = 10;
      var a = 1;
      let arg; // 报错
    }
    
    // 报错
    function func(arg) {
      let a = 10;
      let a = 1;
      let arg; // 报错
    }

      小提示:JS里面var为什么可以重复声明变量你知道吗?

    块级作用域的作用

      没有块级作用域导致的问题:

        1:内存作用域的变量会覆盖外层变量

        2:for循环里面的变量沦为全局变量,我们本想只让i控制循环,但是循环结束以后,i变成了一个全局变量了

      优点:

        1:IIFE不再必要了,我们只需要一个块级作用域就可以了,里面的变量采用let命令声明就行

        2:ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用

        小提示:ES5规定,函数声明只能在全局作用域和函数级作用域中使用,不能再块级作用域使用,你知道为什么吗?

    const命令

      1:const命令的基本用法,定义一个不可更改的变量,并且定义的时候需要初始化

      2:const命令声明的变量也只能在所在的代码块中有效,也不存在变量提升,就是存在暂时性死区,同时也不能重复声明

      重点:const定义常量的本质在于,他保证的不是变量的值不能改变,而是变量指向的内存的地址不能改变,对于简单变量来说,值就保存在变量指向的那个地址;但是对于复杂的数据来说,变量指向的地址只是一个指针而已,如果该指针指向的数据结构发生改变,那么其实该数据还是发生改变的,所以用const定义一个对象是很不稳定的。

    ES6声明变量的方法六种

      分别是var function let const import class

    顶层对象的属性

      1:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。

      2:ES5 之中,顶层对象的属性全局变量是等价的

      3:ES6规定,var function 声明的变量依旧还是顶层对象的属性,使用let const class 声明的全局变量,不再属于顶层对象了

    var a = 1;
    // 如果在 Node 的 REPL 环境,可以写成 global.a
    // 或者采用通用方法,写成 this.a
    window.a // 1
    
    let b = 1;
    window.b // undefined
    不忘初心,不负梦想
  • 相关阅读:
    统计次数
    使用正则消除行号
    【收集】sql查询统计,周,月,年
    ASP.NET脚本过滤-防止跨站脚本攻击(收集别人的)
    win10环境下jdk1.8+Android Developer Tools Build: v22.3.0-887826的问题
    关于虚拟机的问题解决(转自豆瓣)
    工作
    numpy学习
    deepin Python pycharm安装
    pymysql连接和操作Mysql数据库
  • 原文地址:https://www.cnblogs.com/panrui1994/p/8989017.html
Copyright © 2011-2022 走看看