词法作用域

250 阅读1分钟

作用域

作用域是指程序源代码中定义变量的区域。

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

JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。

想了解更多关于作用域的问题推荐阅读《你不知道的JavaScript上卷》第一章(或第一部分),
从编译原理的角度说明什么是作用域。概括的说作用域就是一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。

词法作用域

在《你不知道的javascript上卷》中是这样定义的:词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。 在JS中词法作用域的规则:

  • 函数允许访问函数外部的数据
  • 整个代码结构中只有函数可以限定作用域
  • 作用规则首先使用提升规则分析
  • 如果当前作用域中有了名字了,就不考虑外面的名字

例1

var a = 2;
function foo() {
  var a = 3;
  console.log(a); // 3
}
foo();

例2

function foo() {
  console.log(a); // 2
}
function bar() {
  var a = 3;
  foo();
}
var a = 2;
bar();