您好,欢迎访问一九零五行业门户网

JavaScript闭包详细介绍

本文主要和大家详细介绍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闭包详细介绍的详细内容。
其它类似信息

推荐信息