变量提升:
使用var声明的变量,无论实际声明位置在何处,都会视为被声明于所在函数的顶部。若声明不在任意函数内,则视为在全局作用域的顶部。
块级作用域:
1)函数内部;
2){}包裹的代码块内部
块级声明: 包括let声明和const声明,两者对比:
共同点:
- 声明不会提升;
- 同一作用域内,禁止重复声明;
- 在声明的语句块之外不能被访问;
区别:
- const声明的变量必须在声明时初始化,且不允许再修改,试图对const变量再次赋值会报错;
- const声明对象,会阻止对于对象绑定和对象自身值得修改,但并不会阻止对变量成员的修改。
暂时性死区
let和const声明的变量,在声明之前使用会报错,即使是用安全的typeof操作符
循环中的块级绑定
替代立即执行函数解决闭包问题
- 循环内的let声明:
let声明通过模拟IIFE(立即执行函数)的作用而简化了循环,在每一次的迭代中,都会创建一个新的同名变量并对其进行初始化。这种方式适用于for循环,for-in和for-of。
- 循环内的const声明:
const在for-in和for-of中使用的效果和let相同,但是不能用于for循环,因为for循环试图改变已绑定的变量值。
全局块级绑定
- var声明的全局变量,会成为浏览器window对象上属性,所以当window对象中原本就有同名属性时,会被var声明的全局变量覆盖;
- let和const声明的全局变量,不会成为浏览器window对象上属性;
块级绑定最佳实践
默认情况使用const,仅在变量值确实需要被更改的情况下才使用let。