Dotcpp  >  编程教程  >  JavaScript函数  >  JS函数闭包介绍

JS函数闭包介绍

点击打开在线编译器,边学边练

闭包是JS中的一大难点也是一大特色,在许多应用实现都是依靠闭包实现的,本节我们来介绍闭包的基本概念。

什么是闭包?

闭包是指在函数内部创建的一个函数,该函数可以访问外部函数中的变量和参数,即使外部函数已经执行完毕,也能够保留对这些变量的引用。换句话说,闭包可以在其词法作用域外部继续访问变量。

要理解闭包,首先需要了解JavaScript中的作用域和词法环境。每当函数被调用时,都会创建一个新的词法环境,用于存储该函数的变量和参数。当函数执行完毕后,通常会销毁其词法环境,释放其中的变量。

但是,在创建闭包时,内部函数仍然保留对外部函数词法环境中变量的引用,因此这些变量不会被销毁,可以在内部函数中继续访问和操作。

闭包有以下特点:

1. 内部函数可以访问外部函数中的变量:闭包形成了一个作用域链,内部函数可以访问其外部函数中声明的变量和参数,包括外部函数执行完毕后仍然存在的变量。

2. 外部函数的变量不会被销毁:由于闭包中仍然引用了外部函数的变量,这些变量不会被垃圾回收机制回收,而是一直保留在内存中,直到闭包被销毁。

闭包的使用场景包括但不限于以下情况:

1. 封装私有变量:通过闭包可以创建私有变量,仅在闭包内部可访问,从而实现信息隐藏和封装。

2. 延迟执行:通过使用闭包,可以延迟函数的执行,例如在定时器中传递一个闭包函数来实现延迟执行某段代码。

3. 存储状态:闭包可以存储函数内部的状态,在多次调用中保持状态的连续性,常见的应用场景包括计数器、缓存等。

需要注意的是,闭包会引用外部函数中的变量,导致这些变量无法被垃圾回收。因此,在使用闭包时,需要注意内存管理,避免引起不必要的内存泄漏。

 

我们来举一个简单的例子来说明闭包的概念:

当我们使用闭包时,经常会遇到的一种情况是创建一个计数器,使其能够在多次调用中保持状态的连续性。以下是一个使用闭包实现计数器的简单例子:

function createCounter() {
  let count = 0;
  function increment() {
    count++;
    console.log(count);
  }
  return increment;
}
// 创建计数器函数
const counter = createCounter();
// 多次调用计数器函数,计数器状态保持连续
counter(); // 输出: 1
counter(); // 输出: 2
counter(); // 输出: 3

在上面的例子中,createCounter函数返回了内部定义的increment函数。每次调用 createCounter 函数时,都会创建一个新的词法环境,并将 count 变量初始化为 0。

返回的 increment 函数形成了一个闭包,它可以访问并修改 createCounter 函数中的 count 变量。每次调用 increment 函数时,count 的值增加 1,并在控制台输出结果。

通过多次调用 counter() 函数,可以看到计数器状态保持连续,每次输出值都会递增。这是因为闭包中的 count 变量在多次调用中保留了其之前的值,并且这个变量不会被销毁。这就是闭包的作用之一:存储状态。



本文固定URL:https://www.dotcpp.com/course/1323

上一课:

JS返回值

下一课:

JS函数闭包用法

JavaScript教程
第一章 JavaScript入门
第二章 JavaScript基础语法及数据类型
第三章 JavaScript函数
第四章 JavaScript类
第五章 JS高级教程
第六章 JS Window
第七章 JS库
Dotcpp在线编译      (登录可减少运行等待时间)