zoukankan      html  css  js  c++  java
  • ES6 新增声明变量的 var let const 的区别详解

    var

    如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域。

    let
    1、let 声明的变量具有块作用域的特征。
    2、在同一个块级作用域,不能重复声明变量。
      function foo(){
        let a = 1;
        let a = 2;//Uncaught SyntaxError: Identifier 'a' has already been declared
      }

    3、let 声明的变量不存在变量提升,换一种说法,就是 let 声明存在暂时性死区(TDZ)。

      for (var i = 0; i < 5; i++) {
        setTimeout(function(){
          console.log(i);
        },100)
      };
    会打印4个4 :setTimeout是异步执行的,100毫秒后向任务队列里添加一个任务,只有主线上的全部执行完才会执行任务队列里的任务,所以当主线程for循环执行完之后 i 的值为5,这个时候再去任务队列中执行任务,i全部为5;每次for循环的时候setTimeout都会执行,但是里面的function则不会执行被放入任务队列,因此放了5次;for循环的5次执行完之后不到1000毫秒;1000毫秒后全部执行任务队列中的函数,所以就是输出五个5啦

      for (let i = 0; i < 5; i++) {
        setTimeout(function(){
          console.log(i);
        },100)
      };
    会打印0,1,2,3,4:假如把var换成let,那么输出结果为0,1,2,3,4;因为let i 的是区块变量,每个i只能存活到大括号结束,并不会把后面的for循环的 i 值赋给前面的setTimeout中的i;而var i 则是局部变量,这个 i 的生命周期不受for循环的大括号限制;


    const

    声明方式,除了具有 let 的上述特点外,其还具备一个特点,即 const 定义的变量,一旦定义后,就不能修改,即 const 声明的为常量。

    const obj = {a:1,b:2};
    console.log(obj.a);//1
    obj.a = 3;
    console.log(obj.a);//3

    所以准确的说,是 const 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。

  • 相关阅读:
    CS academy Binary Flips(dp)
    [POJ 1637] Sightseeing tour(网络流)
    Codeforces 346D Robot Control(01BFS)
    BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
    驱动之SPI,UART,I2C的介绍与应用20170118
    USB驱动之CDC类的介绍与应用20160905
    uCOS-II之移植20160823
    java之面向对象20160818
    Java之基础20160806
    Android之框架20160721
  • 原文地址:https://www.cnblogs.com/zjz666/p/11088347.html
Copyright © 2011-2022 走看看