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