作用域 与 this 值

对于作用域而言,可以将作用域分为动态作用域和词法作用域。js 中的作用域属于词法作用域。

词法作用域

对于使用词法作用域而言,词法作用域最重要的规则在于词法作用域的定义过程发生在代码的书写阶段。代码如下:
1
2
3
4
5
6
7
8
9
function foo() {
console.log(a) // 2
}
function bar() {
var a = 3;
foo();
}
var a = 2;
bar();
因为这里面的 foo 函数书写在全局的作用域中,因此会被输出 2

动态作用域

动态作用域关心的是函数是在哪里被调用的。上面的函数中使用动态作用域的时候 最终输出应该是 3,因为从 foo 函数被调用的地方寻在变量 a 最后找到了 var a = 3.词法作用域关心的是函数在那里被声明, 动态作用域关心的是函数在哪里被调用。使用js 中的 this 的时候, this 的效果是类似于使用动态作用域的。