上下文
- 全局上下文 EC(G)
- 函数执行私有上下文 EC(FN)
- ES6 新的块级上下文 EC(BLOCK)
块级上下文
除函数和对象的大括号之外,其他大括号如果出现了let、const、function、class 等关键字声明变量,则当前大括号会产生一个块级上下文。它的上级上下文就是所处的环境。var 声明不会产生块级上下文,也不受块级上下文的影响。
练习题
console.log(a); // undefinedvar a = 1;let b = 2;if (true) {console.log(a); // 1var a = 3;let b = 4;console.log(a); // 3console.log(b); // 4}console.log(a); // 3console.log(b); // 2
console.log(fn); // undefinedif (true) {console.log(fn); // function fn() {}// 按照常量来讲,此处跳过即可(变量提升阶段已经完成过了),但是本次不行,// 这一行代码既被全局声明过,也被块级声明过,所以他会把当前私有上下文中,本行代码以上对 fn 的所有操作,同步给全局一份// 但是本行代码以下对 fn 的操作和全局就没有任何关系了function fn() {}fn = 1;console.log(fn); // 1}console.log(fn); // function fn() {}
在新版浏览器中,按照 ES6 的新语法规范
- 判断体中出现的 function ,不论条件是否成立,都是先声明不定义
- 判断体中出现 function 会产生块级私有上下文
