在ES5中,只存在全局作用域和函数作用域。而且var声明存在变量提升的问题。
这个函数会输出什么?test? hello world? 不不不,是undefined。因为ES5中没有块级作用域,而且存在变量提升的问题。这个函数实际上的执行如下代码
这是由于变量提升导致的内层变量覆盖了外层的变量。
什么是变量提升?
变量可以在声明之前使用,值为undefined。这就是变量提升。
let声明不存在变量提升:let 声明的变量必须要在声明之后使用,否则就会报错。
let声明不存在变量提升的原理:暂时性死区
只要作用域中存在let声明,那么这个变量就会绑定这个区域。同时,这个区域会变成一个块级作用域。只要这个区域中存在let声明,那么let声明的变量就会被存放在暂时