闭包基本上面试中都会被问到的一个问题,但是应该怎么回答才能让面试官满意呢,其实这个就看面试官了,这里不多说,先阐述我对闭包的理解。
1、首先闭包定义:闭包就是能够读取函数内部的一个变量的函数。
应用场景:当我们在封装一个通用模块时,在模块中定义一个变量,不想让这个变量污染全局变量并且不会被内存释放的时候,就可以使用闭包;
创建闭包方式:函数A里面创建了另一个函数B,并返回这个B函数,在B里面修改了A函数中定义的变量,这个变量会一直保存在这个闭包形成的环境中,不会被垃圾回收处理。
function A(){
var n=999;
return function B(){
alert(n); // 999
}
}
2、变量作用域
变量作用域:全局(函数外部)和局部变量,
局部变量:var声明变量只在函数作用域中有效【函数中声明的变量作用域】
没有var声明就会变成全局变量;有var就是局部变量;var具有变量提升的功能
函数可以用来创建函数作用域,函数就像一层半透明玻璃,里面可以看到外面,外面看不到里面的变量
3、函数的生存周期
全局变量:生存周期是永久的,除非我们主动销毁这个全局变量
var声明的局部变量:当退出函数时,他会随着调用函数的结束而随之销毁
闭包函数:当退出函数后,局部变量不会消失,在某个函数中存在
4、闭包的作用:封装变量;延续局部变量的寿命
封装变量因为使用闭包可以访问到函数内部变量
延续局部变量寿命是因为不会随函数调用结束而被垃圾回收掉
5、闭包与内存管理
闭包会造成内存泄露,所以要尽量减少闭包的使用,其实这种说有误的。因为使用闭包是开发者自己定义的,在不用的时候将这个变量置为null就不占内存了;
其次循环应用的问题它会造成内存泄漏,这个主要还是因为浏览器本省的原因,循环引用计数造成的,只要将变量置为null也就没有这个问题了
使用闭包注意:
1、由于使用闭包使得函数内部的变量保存在内存中,内存消耗很大,网页性能不好,避免滥用闭包;【解决方法:在退出函数前,将不适用的局部变量全部删除】
2、闭包会在父函数外面,改变父函数内部的变量;所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。