写在前面
最近在学习JS的高级部分,涉及到了闭包,个人理解不是很到位随便写点记录为主,有不对的地方欢迎指出
闭包是什么
闭包 = closure
英文大致词意为:闭合、封闭;
闭包主要是为了实现出让函数外界访问函数、方法内部的变量;声明出的变量保存在子函数或其他函数的scopes(作用域)里绑定,会防止变量被JS的GC自动回收。
简单来说就是可以实现在一个作用域内访问另一个作用域的私有变量;
或者为函数在执行过程中,返回了另一个函数,亦或变量、引用…
闭包的条件
1、若要想在另一个作用域中访问别的作用域变量等,函数在调用时返回了另一个函数的引用;
2、返回的函数中包含了父级的引用;
3、函数外有变量或其他数据类型引用了返回值
闭包基本实现
举个栗子
@Autor: 梁大炮
function y() {
var a = 10;
return function () {
a++;
console.log(a)
}
}
var b = y();
b()
闭包的return
严格意义来讲,闭包的return基于使用场景来进行判断,并非一定要有return
当我们外界需要闭包的引用我们才需要进行return,外界不需要则不写return,只要调用了闭包我们函数内部的值的生命周期就可以在内存中一直存在,所以不一定需要return,但使用闭包的大部分场景都需要进行return函数中的值亦或为引用;
闭包的内存泄漏
还这段代码
@Autor: 梁大炮
function y() {
var a = 10;
return function () {
a++;
console.log(a)
}
}
var b = y();
b()
可以看到我们使用了var b来进行接收函数y()
,因为b是一个全局变量,除非我们关闭页面,GC才进行回收,除非是不会从内存中进行销毁的;
然后我们看b的调用结果为11;
也就是说,b引用了y(),y返回了匿名函数,匿名函数中有变量a,所以这个时候就造成了内存泄漏
函数内部包裹函数,作用域链得不到释放,造成消耗内存
闭包的优缺点
优点:
1、可以保护私有变量不被外界进行污染,也包括可以重复命名等 2、可以进行更连贯的逻辑书写; 3、内部的匿名函数减少内存的使用,提高性能
缺点:
1、使用完变量后不可以让CG主动去进行垃圾回收,但是也有解决方法:手动给值为null 2、很容易回内存泄漏