上下文

  • 全局上下文 EC(G)
  • 函数执行私有上下文 EC(FN)
  • ES6 新的块级上下文 EC(BLOCK)

块级上下文

除函数和对象的大括号之外,其他大括号如果出现了let、const、function、class 等关键字声明变量,则当前大括号会产生一个块级上下文。它的上级上下文就是所处的环境。var 声明不会产生块级上下文,也不受块级上下文的影响。

练习题

  1. console.log(a); // undefined
  2. var a = 1;
  3. let b = 2;
  4. if (true) {
  5. console.log(a); // 1
  6. var a = 3;
  7. let b = 4;
  8. console.log(a); // 3
  9. console.log(b); // 4
  10. }
  11. console.log(a); // 3
  12. console.log(b); // 2
  1. console.log(fn); // undefined
  2. if (true) {
  3. console.log(fn); // function fn() {}
  4. // 按照常量来讲,此处跳过即可(变量提升阶段已经完成过了),但是本次不行,
  5. // 这一行代码既被全局声明过,也被块级声明过,所以他会把当前私有上下文中,本行代码以上对 fn 的所有操作,同步给全局一份
  6. // 但是本行代码以下对 fn 的操作和全局就没有任何关系了
  7. function fn() {}
  8. fn = 1;
  9. console.log(fn); // 1
  10. }
  11. console.log(fn); // function fn() {}

在新版浏览器中,按照 ES6 的新语法规范

  1. 判断体中出现的 function ,不论条件是否成立,都是先声明不定义
  2. 判断体中出现 function 会产生块级私有上下文