2023前端面试题-前端Js面试题-详细的说一下你对‘闭包’的理解

86 阅读2分钟

闭包是指有权访问另一个函数作用域中的变量的函数,即使这个变量在原函数被返回后已经被销毁。

具体来说,当一个内部函数被其外部函数以及外部函数的变量引用时,就形成了一个闭包。这个闭包包含了内部函数以及外部函数的变量,这些变量在内部函数中依然可以被访问到。由于 JavaScript 中的函数是一等公民,可以作为参数传递,也可以作为返回值返回,因此闭包也常常出现在高阶函数中。

使用闭包可以实现许多功能,例如:

1、封装变量:可以使用闭包将变量私有化,只能通过函数提供的接口来访问和修改,从而实现封装的效果。

2、延迟执行:可以使用闭包来延迟执行函数,将一些操作保存起来,待需要执行的时候再执行。

3、实现函数柯里化:柯里化是指将一个接受多个参数的函数变成接受单一参数(第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

4、实现函数记忆:函数记忆是指缓存函数的计算结果,从而提高函数的执行效率。

使用闭包也需要注意一些问题,例如:

1、内存泄漏:由于闭包会一直持有外部函数的作用域,因此如果闭包一直存在,外部函数的变量也无法被释放,可能会导致内存泄漏。

2、性能问题:由于闭包会持有外部函数的作用域,因此如果在循环中使用闭包,可能会导致性能问题,因为会创建大量的闭包。可以使用立即执行函数表达式(IIFE)或者使用 let 声明来避免这个问题。

闭包示例:

function outer() {
  var x = 10;
  function inner() {
    console.log(x);
  }
  return inner;
}

var innerFunc = outer(); // 生成一个闭包
innerFunc(); // 输出 10

在上面示例中,一个函数返回一个内部函数,该内部函数可以访问到函数作用域内的变量,这样的函数就是闭包

更多前端面试题请看:存图,扫

daan-s.png