词法作用域
在函数声明(定义)的时候就已经确定了,由变量和块作用域的位置决定。
JS使用的是词法作用域,它最重要的特征是它的定义发生在代码的书写阶段。
动态作用域
在函数调用时确定 动态作用域不关心函数的作用域是如何声明的以及在何处声明的,只关心它从何调用,换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套。但是
this机制和动态作用域类似。
例子
var a = 2;
function foo() {
console.log( a );
}
function bar() {
var a = 3;
foo();
}
bar();
- 如果处于词法作用域,变量a首先在foo()函数中查找,没有找到。于是顺着作用域链到全局作用域中查找,找到为2,赋值,输出2。
- 如果处于动态作用域,变量a首先在foo()函数中查找,没有找到,顺着调用栈找到调用foo()函数的地方,即bar()函数中查找,找到为3,赋值,输出3。