1.变量提升:所有变量的声明会全部压入栈顶执行,也就是声明语句优先执行,统一设置为undefined,换句简单的,变量可以在声明之前使用,值为undefined 2.块级作用域:ES5本身是没有块级作用域的,但是有私有作用域,需要使用自运行函数形成闭包,形成私有作用域,禁止外部读取内部变量; 3.let const 这两个关键字就能够限制变量只作用在当前代码块,{}就是一个代码块,还可以让变量进入暂时性死区,防止变量提升 4.为什么需要块级作用域 用var 声明的变量会出现变量提升,而且,在外部还可以访问到函数里面声明的var变量