面试题 -- JavaScript闭包的概念与理解?

Ray Shine 2022/6/10 JavaScript

# 闭包(closure)

概念

闭包 (opens new window)是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。

创建

JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

特性

  1. 函数嵌套函数。
  2. 内部函数可以引用外层函数的参数与变量。
  3. 参数与变量不会被垃圾回收机制回收,可以通过引用一直访问到这些内容。

# 示例

function init() {
  var name = "Mozilla"; // name 是一个被 init 创建的局部变量
  function displayName() { // displayName() 是内部函数,一个闭包
      alert(name); // 使用了父函数中声明的变量
  }
  displayName();
}
init();

init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。displayName() 是定义在 init() 里的内部函数,并且仅在 init() 函数体内可用。请注意,displayName() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name

# 9大使用场景

  1. 返回值(最常用,如 Vuedata() 函数)
  2. 函数赋值
  3. 函数参数
  4. IIFE(自执行函数)
  5. 循环赋值
  6. gettersetter
  7. 迭代器(执行一次函数往下取一个值)
  8. 首次区分(相同的参数,函数不会重复执行)
  9. 缓存

详情参考理解JavaScript闭包9大使用场景 (opens new window)

# 说说你对闭包的理解?

  • 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在 js 中,函数即闭包,只有函数才会产生作用域的概念.

  • 闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。

  • 闭包的另一个用处,是封装对象的私有属性和私有方法。

最后更新时间: 2022/8/3 14:09:08
ON THIS PAGE