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. 总结
从上述的描述中,可以看出由于生成闭包的时候,外部函数的局部变量(运行时作用域)被内部函数作为词法作用域保存在内存中,故当内部函数被释放之前,该块内存是不会被释放的。因此在使用闭包时,需要非常注意内存泄漏的问题。
Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务