深入理解 JS 中的作用域

118 阅读1分钟

什么是作用域?

作用域是指程序源代码中定义变量的区域, 作用域规定了如何查找变量, 也就是确定当前执行代码对变量的访问权限。

静态作用域和动态作用域

静态作用域也叫做词法作用域, 它的作用域是在词法分析阶段就确定了, 不会改变。而动态作用域是在运行时根据程序的流程信息动态确定。

而 JS 采用的就是词法作用域, 由代码的编写方式静态确定, 下面看一个例子:

var a = 2;

function foo() {
  console.log(a); // 会输出2还是3?
}

function bar() {
  var a = 3;
  foo();
}

bar();

由于 JS 采用的是词法作用域, 因此上面示例会输出 2

总结

  • 词法作用域是在写代码或者定义时确定的, 动态作用域是在运行时确定的
  • 词法作用域关注函数在何处声明, 而动态作用域关注函数在何处调用
  • this 的机制在某种程度上很像词法作用域