返回

函数作用域链探索之旅:通过一道题,洞悉执行奥秘

前端

引言:

在上一篇文章中,我们讨论了 JavaScript 中变量的存储方式。在本篇文章中,我们将继续探讨 JavaScript 中函数的存储过程。通过本文,您将了解作用域链、AO 等概念。

作用域链:

作用域链是一个概念,它了函数在执行期间可以访问的变量。作用域链由当前函数及其父函数(如果有的话)的变量对象组成。当函数被调用时,它会创建一个新的作用域,该作用域将被添加到作用域链中。

AO(激活对象):

AO 是作用域链中的一个重要概念。它是与函数调用相关联的一个对象,它包含了函数的变量和参数。当函数被调用时,会创建一个新的 AO,该 AO 将被添加到作用域链中。

变量提升:

变量提升是一个 JavaScript 中的现象,它将变量的声明提升到其作用域的顶部。这意味着变量可以在其声明之前被访问。然而,变量的值在声明之前仍然是 undefined。

词法作用域:

词法作用域是 JavaScript 中的一种作用域,它由函数的词法环境决定。词法环境是指函数被声明时的作用域。这意味着函数可以访问其声明作用域中的变量,即使这些变量在函数内部没有被声明。

题目:

考虑以下代码:

function outer() {
  var a = 10;
  function inner() {
    var b = 20;
    console.log(a); // 10
    console.log(b); // 20
  }
  inner();
}

outer();

问题:

当 inner 函数被调用时,它可以访问哪些变量?为什么?

解答:

inner 函数可以访问两个变量:a 和 b。a 是 outer 函数声明的作用域中的变量,而 b 是 inner 函数声明的作用域中的变量。这是因为 JavaScript 使用词法作用域,这意味着函数可以访问其声明作用域中的变量。

当 inner 函数被调用时,作用域链如下:

  • inner 函数的 AO
  • outer 函数的 AO
  • 全局作用域

inner 函数可以访问其自己的 AO 中的变量 b,以及其父函数 outer 的 AO 中的变量 a。这是因为作用域链允许 inner 函数访问其声明作用域中的变量。

结论:

通过这道题,我们了解了 JavaScript 中函数的作用域链是如何工作的。我们还了解了 AO 和词法作用域的概念。通过理解这些概念,您可以更深入地了解 JavaScript 中函数的执行过程。