# 各作用域的理解

# 释义

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

# 规定

其规定了如何查找变量,即确定了当前执行的代码段对于变量的访问权限。

# 静态作用域和动态作用域

  • 静态作用域又称 词法作用域,其区间在 函数声明 的时候就已经决定了。
  • 动态作用域,其区间在 函数调用 的时候才决定。

# 示例

尝试带着问题去阅读以下代码,思考作用域的运行过程:

  1. 最终的console.log输出了什么?
  2. js是以哪种 作用域 来执行下段代码的?
var value = 1;

function foo() {
    console.log(value);
}

function bar() {
    var value = 2;
    foo();
}

bar();

// 结果是 ???
示例解析

假设JavaScript采用静态作用域,让我们分析下执行过程:

执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。

...............................................

假设JavaScript采用动态作用域,让我们分析下执行过程:

执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。

因为JavaScript采用的是静态作用域,所以这个例子的结果是 1。

# 参考文章

  1. JavaScript深入之词法作用域和动态作用域 (opens new window)
  2. JavaScript词法作用域 (opens new window)