《Understanding ES6》 chapter1 Block Bindings

183 阅读2分钟

变量提升

使用var声明的变量,无论实际声明位置在何处,都会视为被声明于所在函数的顶部。若声明不在任意函数内,则视为在全局作用域的顶部。

块级作用域

1)函数内部;

2){}包裹的代码块内部

块级声明: 包括let声明和const声明,两者对比:

共同点:

  1. 声明不会提升;
  2. 同一作用域内,禁止重复声明;
  3. 在声明的语句块之外不能被访问;

区别:

  1. const声明的变量必须在声明时初始化,且不允许再修改,试图对const变量再次赋值会报错;
  2. const声明对象,会阻止对于对象绑定和对象自身值得修改,但并不会阻止对变量成员的修改。

暂时性死区

let和const声明的变量,在声明之前使用会报错,即使是用安全的typeof操作符

循环中的块级绑定

替代立即执行函数解决闭包问题

  1. 循环内的let声明:

let声明通过模拟IIFE(立即执行函数)的作用而简化了循环,在每一次的迭代中,都会创建一个新的同名变量并对其进行初始化。这种方式适用于for循环,for-in和for-of。

  1. 循环内的const声明:

const在for-in和for-of中使用的效果和let相同,但是不能用于for循环,因为for循环试图改变已绑定的变量值。

全局块级绑定

  1. var声明的全局变量,会成为浏览器window对象上属性,所以当window对象中原本就有同名属性时,会被var声明的全局变量覆盖;
  2. let和const声明的全局变量,不会成为浏览器window对象上属性;

块级绑定最佳实践

默认情况使用const,仅在变量值确实需要被更改的情况下才使用let。