词法作用域
总结一下作用域的定义:作用域就是一套规则,这套规则用于引擎如何进行查找变量以及在哪找到变量(可以看看之前我博客写的引擎和作用域之间的对话)。
作用域分为词法作用域(也叫静态作用域)和动态作用域,大多数语言采用的都是词法作用域,当然包括js。
此法作用域最重要的特征就是它的定义过程发生在代码的书写阶段而不是运行阶段。接下来看个例子对比一下静态和动态就好理解了:考虑以下代码在静态作用于下和动态作用域下分别输出什么结果
function foo(){
console.log(a);
}
function bar(){
var a = 3;
foo();
}
var a = 2;
bar();
静态作用域关心的是函数和作用域是如何声明以及在何处声明的,而动态作用域只关心它们从何处调用的,换句话说就是静态作用域基于作用域嵌套,动态作用域基于调用栈。需要声明的是JavaScript只有静态作用域,但是this机制在某种程度上很像动态作用域。
所以最后结果就是静态作用下输出2,动态作用于下输出3。
静态作用于下foo确定的函数中找不到a,于是会通过RHS查询找到全局中的a,所以输出2;
动态作用于下foo确定的函数中找不到a,会顺着调用栈在调用foo的地方查找a,而foo是在bar中调用的,所以便找到了3。