js作用域
函数作用域里面可以访问全局作用域,反之不行。
js作用域里面的内部原理:编译-执行-查询-嵌套-执行
js脚本里没有编译的概念,而是边解释边执行 // 这句话有问题的吧。js从编译到执行过程javaScript`执行过程分为两个阶段,编译阶段和执行阶段。本文将重点分析第二阶段,并且在这基础 – 掘金
js在当前作用域无法找到某个变量时,会向上一级的作用域进行查找,直到找到最外层的全局作用域为止。

最后一行,a是定义在全局对象window上的变量(非严格模式),严格模式下,a的引用会报错
作用域分为词法作用域,和动态作用域。js中不存在动态作用域。
作用域从最具体的一个开始,向上进行查找到第一个匹配的标识符。更具体的标识符,会遮蔽同名的更上层作用域里的标识符。
变量的声明提升:遇到var关键字,会把var语句提到当前作用域的最上面。也叫做预解释。

比如如下代码;
console.log(a);
var a = 2;
经过变量提升后,会变成:
var a;
console.log(a);
a = 2;
所以输出值是undefined
下面的代码,3个输出打印都是undefined.

函数的声明提升:
fn()
function fn() {
xxx;
}
以上的代码不会报错。
但是函数表达式不会提升。具名的函数表达式也不会提升。



后面的函数声明会覆盖前面的。
自由变量:在当前作用域中存在但是没有在当前作用域中声明的变量。一旦存在自由变量,就一定有作用域链。查找机制是,沿着作用域链往上级查找,直到查到对应变量为止。如果查找不到,直接报错。
有一个执行环境栈

