当一个嵌套的内部函数引用了嵌套的外步函数的变量(或函数)时,就产生了闭包
理解:
1.闭包是嵌套的内部函数
2.包含被引用变量(函数)的对象
注:闭包只存在于嵌套的内部函数中
闭包的作用
-使函数内部的变量在函数执行完毕后,仍然存活在内存中(即延长了局部变量的生命周期)
-使函数外部可以读写到函数内部的数据(变量/函数)
闭包的产生与死亡
-产生:在嵌套的内部函数定义执行完毕时就产生了(而不是在调用的时候)
-死亡:在嵌套的内部函数成为垃圾对象时死亡
闭包的应用
定义具有特定功能的JS模块,将所有数据和功能都封装在一个函数内部,
只向外暴露一个包含n个方法的对象或函数,
模块的使用者只需要通过模块暴露的对象调用方法来实现对应的功能
闭包的缺点
-函数执行完毕后局部变量没有释放,占用内存的时间变长
-容易造成内存泄漏
内存溢出和内存泄漏的区别:
内存溢出:当程序运行需要的内存超过剩余内存时就会出现内存溢出的错误
内存泄漏:占用的内存没有及时释放会导致内存泄漏,内存泄漏积累过多会导致内存溢出
常见的内存泄露:
多余意外的全局变量
没有及时清理的计时器或回调函数
闭包
闭包的简单理解测试
function fun(n,o){
console.log(o)
return{
fun:function(m){
return fun(m,n)
}
}
}
var a = fun(0)//undefined
a.fun(1) //0
a.fun(2) //0
a.fun(3) //0
var b = fun(0).fun(1).fun(2).fun(3)//undefined 0 1 2
var c = fun(0).fun(1); c.fun(2); c.fun(3)//undefined 0 1 1