一、let:
1、let声明的变量只在它所在的代码块内有效;
2、let声明的变量不存在变量提升;(变量提升:变量可以在声明之前使用,值为undefined);
3、暂时性死区(temporal dead zone):在代码块内,使用let声明变量之前,该变量都是不可用的;
4、let不允许在相同作用域内,重复声明同一个变量。
二、块级作用域:
1、为什么需要:内层变量可能会覆盖外层变量、用来计数的循环变量泄露为全局变量;
2、外层作用域无法读取内层作用域变量;
3、内层作用域可以声明外层作用域同名变量;
4、立即执行函数不再必要;
5、 块级作用域内能不能声明函数?
三、const:
1、const声明的是一个只读常量,一旦声明,常量的值就不会改变(总是指向一个固定的地址,它指向的数据结构是不是可变的,就完全不可控了);
2、对于const来说,只声明不赋值,就会报错;
3、同let的特性。
四、顶层对象的属性:
顶层对象,在浏览器环境指的是window对象,在node指的是global对象,web worker指的是self。
var命令和function命令声明的全局变量,依旧是顶层对象的属性;let、const、class声明的全局变量,不再是顶层对象的属性。