欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

JavaScript闭包详细介绍

程序员文章站 2022-03-17 12:08:26
...

本文主要和大家详细介绍JavaScript闭包,说起闭包,相信写前端的同学都知道,而且相信在实际的项目中或多或少都已经用到了闭包。那到底什么才是闭包,闭包又是怎么产生的呢?

1. 什么是闭包
在阮老师的文章中提到:

闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

2. 闭包的作用
一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

3. 一个简单的闭包实例

function count() {    let num = 0;    return function add() {        return ++num;
    }
}let a = count();
a();  //1a();  //2

首先将count()的返回结果也就是count()函数里的返回的函数赋值给a。此时,count()中定义的局部变量num就被保存在内存中。当第一次调用a()时,返回++num,即1;当第二次调用a()时,由于此时num是1,所以返回的结果是2

4. 产生闭包的原因
相信很多人对这个问题都很困惑,都会认为一个函数中,返回一个函数,这样就形成了闭包。其实这仅仅是闭包产生的方法,而不是原因,下面将为大家解释原因。
产生的主要原因是因为JavaScript是词法作用域的,即在该函数定义时就已经被赋予了一个作用域。然后在运行时,又会根据实际运行情况被赋予运行时的作用域。通过这两个作用域一个JS函数才会被正确执行。
以上例为例,在执行count()的时候,该函数的作用域是

运行时作用域 num = 0
词法作用域

当count()执行时,返回add函数的时候,由于此时add处于定义状态,故返回时生成的该函数的词法作用域即为上述count()的作用域。所以当执行a()的时候,其真正的作用域是

add运行时的作用域
count运行时作用域 num = 0
count词法作用域

所以第一次调用add时,由于num是0,所以返回1;而第二次返回是2。

5. 总结
从上述的描述中,可以看出由于生成闭包的时候,外部函数的局部变量(运行时作用域)被内部函数作为词法作用域保存在内存中,故当内部函数被释放之前,该块内存是不会被释放的。因此在使用闭包时,需要非常注意内存泄漏的问题。

相关推荐:

深入理解javascript闭包

关于JavaScript闭包的小结

JavaScript闭包实例的简单应用

以上就是JavaScript闭包详细介绍的详细内容,更多请关注其它相关文章!