什么是作用域?
作用域是指程序源代码中定义变量的区域, 作用域规定了如何查找变量, 也就是确定当前执行代码对变量的访问权限。
静态作用域和动态作用域
静态作用域也叫做词法作用域, 它的作用域是在词法分析阶段就确定了, 不会改变。而动态作用域是在运行时根据程序的流程信息动态确定。
而 JS 采用的就是词法作用域, 由代码的编写方式静态确定, 下面看一个例子:
var a = 2;
function foo() {
console.log(a); // 会输出2还是3?
}
function bar() {
var a = 3;
foo();
}
bar();
由于 JS 采用的是词法作用域, 因此上面示例会输出 2
总结
- 词法作用域是在写代码或者定义时确定的, 动态作用域是在运行时确定的
- 词法作用域关注函数在何处声明, 而动态作用域关注函数在何处调用
this的机制在某种程度上很像词法作用域