一:let
1.块级作用域
外层作用域无法读取内层作用域的变量。
2.不存在变量提升
3.TDZ:暂时性死区
“暂时性死区”也意味着typeof
不再是一个百分之百安全的操作。
这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用,否则就报错。
变量没声明和声明不赋值,返回的都是undefined。
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
4.不允许重复声明
5.js的作用域: 块级作用域 函数作用域 全局作用域
为什么需要块级作用域呢?
答:两种不合理的场景 1.内层变量可能会覆盖外层变量。 2.用来计数的循环变量泄露为全局变量。
二:const
1.声明的值不可以改变。 初始化必须赋值。
2.类似于java的final关键字 对于引用数据类型,是引用地址不可变,但引用指向对象是可以变的。
三:补充
1.ES6的变量声明:var function let const import class
2.ES5之中,顶层对象的属性与全局变量是等价的。 顶层对象的属性与全局变量挂钩,被认为是JavaScript语言最大的设计败笔之一
思考:
1.块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。