一篇文章讲清楚什么是闭包

83 阅读2分钟

闭包是一种在编程中常见的概念,它涉及到函数和作用域的关系。在理解闭包之前,先了解一下作用域。

作用域

作用域是指在程序中定义变量的区域,这些变量在不同的作用域内有不同的可访问性和生命周期。JavaScript 中有全局作用域和局部作用域(函数作用域)。

函数作用域

在函数内部定义的变量通常只能在该函数内部访问,这些变量处于函数的作用域内。但是,JavaScript 具有一个特性,就是函数可以访问其外部作用域中定义的变量。这就是闭包的核心。

闭包

闭包是指一个函数能够访问并使用其外部函数作用域内的变量,即使这个外部函数已经执行结束。当内部函数(闭包函数)引用了外部函数的变量时,这些变量将会被保留在内存中,即使外部函数已经执行完成,内部函数依然可以访问和操作这些变量。

闭包的形成条件

闭包形成的关键是:内部函数引用了外部函数的变量,并且外部函数返回了这个内部函数。

javascriptCopy code
function outerFunction() {
  let outerVar = 'I am from outer';

  function innerFunction() {
    console.log(outerVar); // 内部函数引用了外部函数的变量
  }

  return innerFunction; // 外部函数返回内部函数
}

const closure = outerFunction(); // 调用外部函数,得到内部函数
closure(); // 执行内部函数,依然能访问外部函数的变量

闭包的作用

  1. 保护变量:外部函数的变量在闭包中被封装,不会被其他代码轻易修改。
  2. 实现私有变量:通过闭包,可以模拟实现类似面向对象语言中的私有变量概念。
  3. 延长变量生命周期:即使外部函数执行结束,闭包仍然可以访问外部函数的变量,延长了这些变量的生命周期。

注意事项

使用闭包时需要注意内存泄漏问题,因为闭包会一直保存对外部变量的引用,可能会导致一些不需要的变量一直存在于内存中,造成资源浪费。

闭包是 JavaScript 中强大且常用的特性,合理使用闭包可以实现许多有趣和有用的功能。