对于前端来说,闭包一直是面试被问到的热点问题;但是对闭包的理解一直属于模糊状态,整理了一篇关于闭包的文章,希望能帮助到自己和大家;
说起闭包,首先必须要理解JavaScript中的变量,因为闭包的就是能够访问另外一个函数内部变量的函数;
1.变量的作用域
我们都知道在JavaScript中的变量有两种;全局变量和局部变量;全局变量定义后会储存在window对象中,在页面中任意一个js文件中都可以调用window或者直接使用;
局部变量是定义在函数内部的变量,在函数外部是无法访问的;而且在函数调用结束后浏览器的垃圾回收机制会将局部变量销毁;等到下次调用的时候在重新定义。
2.变量的生存周期
全局变量的生存周期是永久的;局部变量在调用结束后,是会被销毁的
代码中变量c是一个局部变量,但是调用后可以明显的看到,变量并没有被销毁;原因是fun4形成了一个闭包,导致了变量的生命周期的延续。
3.内存管理
在闭包中调用局部变量,导致局部变量一直无法被即使销毁,就会像全局变量一样占用内存;如果要销毁变量,需手动将变量置为null;
在闭包的使用的过程中容易形成JavaScript和DOM对象的循环引用,就有可能造成内存泄漏;这是因为浏览器在垃圾回收机制中,如果两个对象形成了循环引用,那么他们都无法被收回。
fun6函数中用匿名函数创建了一个闭包;变量d是JavaScript的一个对象;DOM对象onclick属性又引用了闭包,而闭包又可以调用d;因而就形成了循环引用;导致这两个对象无法被收回;要解决这个问题 可以手动将变量d设置为null;
其次写法一般建议通过外部引用函数,而不是创建一个匿名函数做为u闭包;