var

 

var会变量提升,在js全局中声明的变量会挂在window上,并且不能被delete掉

 

 

let

  

1.在全局声明的时候,let不会将变量挂到window上

 

2.let不能重复声明

 

let a = 1

let a = 2 //Uncaught SyntaxError: Identifier 'a' has already been declared

 

3.暂存死区:

 

let 声明的变量直到它们赋值时才初始化,在块中的赋值前访问该变量会导致 ​​ReferenceError​​。

变量处在一个自块顶部到赋值处理的“暂存死区”中。 

 

 

function do_something() {

  console.log(bar); // undefined

  console.log(foo); // ReferenceError

  var bar = 1;

  let foo = 2;

}

 

 

(注意,不能直接理解为let没有变量提升,let也是有变量提升的,只是在这之间访问会报错。)

 

下面例子:

 

function test(){

   var foo = 33;

   {

      let foo = (foo + 55); // ReferenceError

   }

}

test();

 

 

在{ }这个块之间创建了let 变量foo,foo这个声明提升到这个块首了,再次访问foo的话就是访问这个块中let定义的foo,所以在赋值let之前访问foo会报错