发布于 2026-01-06 2 阅读
0

JavaScript 闭包:热门面试题及答案

JavaScript 闭包:热门面试题及答案

JavaScript 闭包:热门面试题及答案。

1. JavaScript 中的闭包是什么?

答:
在 JavaScript 中,当一个内部函数定义在一个外部函数内部,并且该内部函数可以访问外部函数的变量和参数时,就创建了一个闭包。即使外部函数执行完毕,内部函数仍然可以访问这些变量。

2. 为什么闭包在 JavaScript 中很重要?

答:
闭包在 JavaScript 中非常重要,因为它们允许数据封装和函数隐私。它们有助于维护清晰的全局作用域,并允许创建外部无法访问的私有变量,这是面向对象编程的一个基本方面。

3. 你能举一个 JavaScript 中闭包的例子吗?

回答:

function outerFunction() {
  var outerVariable = "Hello, ";
  function innerFunction(name) {
    console.log(outerVariable + name);
  }
  return innerFunction;
}
var inner = outerFunction();
inner("John"); // Output: "Hello, John"
Enter fullscreen mode Exit fullscreen mode

在这个例子中,innerFunction 是一个闭包,因为即使 outerFunction 执行完毕,它仍然可以访问 outerFunction 中定义的 outerVariable。

4. 如何在 JavaScript 中使用闭包?

答:
在 JavaScript 中,闭包的实现方式是在一个外部函数内部定义一个内部函数,并返回该内部函数。即使外部函数执行完毕,内部函数仍然可以访问外部函数的变量和参数。

5. 下列代码的输出结果是什么?

function outer() {
  var x = 10;
  function inner() {
    console.log(x);
  }
  return inner;
}
var innerFunc = outer();
innerFunc();
Enter fullscreen mode Exit fullscreen mode

答案:
输出:10
解释:外部函数返回内部函数,内部函数可以访问外部函数内部声明的变量 x。当调用 innerFunc 时,它会输出 x,即 10。

6. 下列代码的输出结果是什么?

function outer() {
  var x = 10;
  function inner() {
    console.log(x);
  }
  x = 20;
  return inner;
}
var innerFunc = outer();
innerFunc();
Enter fullscreen mode Exit fullscreen mode

答案:
输出:20
解释:在返回 inner 函数之前,x 的值被更新为 20。当调用 innerFunc 时,它会记录 x 的更新值,即 20。

7. 下列代码的输出结果是什么?

function outer() {
  var x = 10;
  function inner() {
    var y = 5;
    console.log(x + y);
  }
  return inner;
}
var innerFunc = outer();
innerFunc(); // Output: 15
Enter fullscreen mode Exit fullscreen mode

答案:
输出:15
解释:内部函数既可以访问外部函数的 x (10),也可以访问自身作用域的 y (5),因此输出为 15。

8. 下列代码的输出结果是什么?

function outer() {
  var x = 10;
  function inner() {
    var y = 5;
    console.log(x + y);
  }
  var x = 20;
  return inner;
}
var innerFunc = outer();
innerFunc();
Enter fullscreen mode Exit fullscreen mode

答案:
输出:25
解释:在内部函数返回之前,外部函数内部将变量 x 重新赋值为 20。当调用 innerFunc 时,它输出 x + y,即 20 + 5 = 25。

9. 下列代码的输出结果是什么?

function outer() {
  var x = 10;
  function inner() {
    var y = 5;
    console.log(x + y);
    x = 20;
  }
  return inner;
}
var innerFunc = outer();
innerFunc();
innerFunc();
Enter fullscreen mode Exit fullscreen mode

答案:
输出:
第一次调用:15
第二次调用:25

解释:第一次调用时,x 为 10,y 为 5,因此输出为 15。将 x 更新为 20 后,第二次调用记录 20 + 5,即 25。

10. JavaScript 中何时使用闭包?

答:
当需要维护私有状态或封装全局作用域无法访问的变量时,可以使用闭包。闭包对于创建数据隐私非常有用,尤其是在需要限制对某些变量的访问并控制其访问或修改范围的情况下。

11. 什么是闭包和回调?

答:
闭包和回调是 JavaScript 中的两个不同概念。闭包是一个能够记住自身创建环境的函数,即使外部函数已经返回,它仍然可以访问该外部函数中的变量。而回调则是作为参数传递给另一个函数的函数,它会在外部函数执行完毕后才执行。

12. 封口有两种类型,分别是哪两种?

答:
在 JavaScript 中,闭包有两种类型:词法闭包和动态闭包。词法闭包在编译时创建,可以访问词法作用域中的变量;而动态闭包在运行时创建,可以访问动态作用域中的变量。

13. Lambda 与闭包相同吗?

**答案: *
在 JavaScript 中,lambda 函数只是一个动态创建的匿名函数,没有名称。而闭包则不同,它是一种即使外部函数返回后,仍然能够访问外部函数变量的函数。虽然 lambda 函数可以创建闭包,但它们并不相同。

14. 柯里化和闭包有什么区别?

答案:
柯里化是将一个接受多个参数的函数转换为一系列只接受一个参数的函数的过程。而闭包则是一个可以访问外部函数作用域内变量的函数。柯里化可以使用闭包,但它们是不同的概念。

15. 封闭和封装是一回事吗?

答:
闭包和封装相关但不完全相同。封装是指将数据和操作这些数据的方法打包到一个单元(通常是类)中,并限制对对象某些组件的访问。闭包允许一个函数访问其外部函数的变量,虽然闭包可以用来封装数据,但它们并不等同于封装。

16. JavaScript 是否支持嵌套函数?它们是如何工作的?

答:
是的,JavaScript 支持嵌套函数。嵌套函数定义在另一个函数内部,它可以访问外部函数的变量和参数。这使得闭包、封装和模块化代码结构成为可能。

function sayHiBye(firstName, lastName) {
    // helper nested function to use below
    function getFullName() {
        return firstName + ' ' + lastName;
    }
    console.log('Hello, ' + getFullName());
    console.log('Bye, ' + getFullName());
}
Enter fullscreen mode Exit fullscreen mode

17. 你能解释一下 JavaScript 中的词法环境是什么吗?

答:
在 JavaScript 中,词法环境(Lexical Environment)是一个结构,它保存着特定作用域内的变量绑定、函数和其他值引用。它是 JavaScript 执行上下文的关键组成部分,有助于确定运行时如何访问和解析变量。

18. JavaScript 中的词法环境和嵌套函数如何实现垃圾回收?

答:
在 JavaScript 中,垃圾回收是指回收不再需要的对象所占用内存的过程。当创建一个函数并形成闭包时,存储变量引用的词法环境可能会阻止内存被回收,直到闭包不再使用为止。

function f() {
    let value = 123;
    return function () {
        console.log(value);
    };
}
let g = f(); // g.[[Environment]] stores a reference to the Lexical Environment
// While g exists, the value stays in memory
g = null; // Now the memory is cleaned up
Enter fullscreen mode Exit fullscreen mode

19. JavaScript 中闭包的常见用例有哪些?

答:
闭包的常见用途包括数据封装、函数工厂、记忆化、实现装饰器以及在异步编程中维护状态。

20. 在 JavaScript 中使用闭包有哪些优势?

答:
JavaScript 中的闭包提供了诸多优势,例如隐私性、函数工厂以及在函数调用之间维护状态的能力。它们能够编写更强大、更易于维护和模块化的代码,并支持 JavaScript 中的函数式编程范式。

21. 在 JavaScript 中使用闭包时有哪些缺点或陷阱?

答:
使用闭包可能会导致一些潜在的陷阱,例如,如果闭包管理不当,可能会出现内存泄漏、在内存中保留对变量的不必要引用,或者在不希望的情况下意外修改外部变量。

22. 闭包如何影响 JavaScript 的垃圾回收机制?

答:
闭包会影响垃圾回收,因为它会在外部函数执行完毕后仍然将对变量的引用保留在内存中。如果闭包持有对不再需要的对象的引用,则可能会阻止垃圾回收释放内存。

🔗 在领英上与我联系:

让我们一起深入探索软件工程的世界吧!我经常分享关于 JavaScript、TypeScript、Node.js、React、Next.js、数据结构、算法、Web 开发等方面的见解。无论您是想提升技能,还是想就激动人心的话题展开合作,我都非常乐意与您交流学习,共同成长。

请关注我:Nozibul Islam

文章来源:https://dev.to/nozibul_islam_113b1d5334f/javascript-closures-top-interview-questions-and-answers-1fni