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 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。

posted @ 2019-06-26 10:13  张小中  阅读(355)  评论(0编辑  收藏  举报