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会报错