欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ES6 新增声明变量的 var let const 的区别详解

程序员文章站 2022-05-15 13:32:20
var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域。 let 1、let 声明的变量具有块作用域的特征。 2、在同一个块级作用域,不能重复声明变量。 function foo(){ let a = 1; ......

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