1.let,const和var的概念与区别

var

1.var 属于ES5规范
2.预解析:var有预解析阶段,会被js解析器扫描,然后放进仓库,等待被逐行代码执行,此时var声明的变量初始值是undefined
3.声明提升:当js解析器扫描到var关键字后,会将var声明的变量放进当前作用域的顶部
4.作用域:全局作用域或者函数作用域
5.挂在对象:声明的全局变量会挂载到window对象上

let

1.let属于ES6规范
2.let只在块级别作用域有效—-{}``

  1. for (var i = 0; i < 10; i++) {
  2. console.log(i);
  3. };
  4. alert(i);
  5. for (let v = 0; v < 10; v++) {
  6. console.log(v);
  7. }
  8. alert(v);
  9. if(true) let a = 20; //会报错
  10. if(true)
  11. {
  12. let a = 20; //不会报错
  13. }

3.let声明变量不会提升

let声明的变量一定要在声明之后使用,否则报错

  1. alert(a);
  2. var a = 2;
  3. alert(b);
  4. let b = 2;
  5. //注意:let声明的变量一定要在声明之后使用,否则报错。

4.不能通过let声明和形参相同的变量

  1. function test(a) {
  2. let a = 123;
  3. console.log(a);
  4. }
  5. test(456);

5.暂时性死亡

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

在暂时性死区中使用let或const声明的变量,会报错
6.let 声明全局变量
let申明的全局变量,不会成为windows的属性,并没有挂载到window对象上

const

1.属于ES6规范
2.声明只读常量

const常量一旦声明就不能重新赋值

3.必须初始化

const一旦申明,就必须立即初始化,不能留到以后赋值

4.const本质

const实质上保证的并不是值不能改变,而是指向的那个内存地址不能改变