返回

剑指面试:JavaScript 执行上下文、作用域链、闭包指南

前端

JavaScript面试中的执行上下文、作用域链和闭包

作为一名 JavaScript 开发人员,了解执行上下文、作用域链和闭包至关重要。这些概念是 JavaScript 面试中常见的考点,掌握它们可以让你在竞争激烈的求职市场中脱颖而出。

执行上下文

执行上下文是 JavaScript 运行代码的特定环境。它包含一组变量对象(活动对象)和词法环境(作用域链),用于确定变量和函数的可用性。

函数执行上下文:

  • 当一个函数被调用时,一个新的执行上下文被创建。
  • 活动对象包含函数的参数和局部变量。
  • 词法环境链接到调用函数的作用域链。

全局执行上下文:

  • 当脚本开始执行时,创建一个全局执行上下文。
  • 活动对象包含全局变量。
  • 词法环境为空。

作用域链

作用域链是一条变量对象的链表,用于在嵌套作用域中查找变量。JavaScript 遵循词法作用域规则,这意味着变量在声明时确定的范围内可见。

  • 当在函数内部访问变量时,JavaScript 会按作用域链向上搜索,直到找到该变量。
  • 如果在作用域链中找不到该变量,它将在全局执行上下文中进行搜索。

闭包

闭包是一个函数,可以访问其创建时的作用域链。即使创建闭包的作用域链不再可用(函数已经返回),闭包仍然可以访问这些变量。

闭包的优点:

  • 封装数据和行为,防止外部访问。
  • 创建私有变量和方法。
  • 延迟执行,直到函数返回后。

闭包的缺点:

  • 可能会导致内存泄漏,因为闭包会引用其创建时的作用域链。
  • 可能会使调试变得困难。

实践练习

问题 1:

预测以下代码的输出:

function outer() {
  const x = 10;

  function inner() {
    console.log(x);
  }

  inner();
}

outer();

问题 2:

给定以下代码,解释闭包是如何使用的:

function createCounter() {
  let count = 0;

  return function() {
    count++;
    console.log(count);
  };
}

const counter = createCounter();
counter();
counter();
counter();

答案:

问题 1:

10

问题 2:

该闭包创建了一个计数器,每次调用时都会递增。变量 count 被封装在闭包中,因此即使 createCounter 函数返回后,计数器仍然可以访问它。

结论

掌握执行上下文、作用域链和闭包是 JavaScript 开发人员面试成功的一个关键要素。通过理解这些概念,你将能够自信地回答有关这些主题的问题,并展示你对 JavaScript 的深入理解。