闭包,js里经典的话题,用一句话对之概括:有权访问另一个函数作用域内变量的函数都是闭包。
一道比较经典的闭包题:
function fun(n,o){
console.log(o);//输出第二个参数值
return {
fun:function(m){//保护:第一个参数值
return fun(m,n);
}
}
}
var a=fun(0);//undefined
//a:{
// fun:function(m){//(n=0)
// return fun(m,n);
// }
//}
a.fun(1);//0
a.fun(2);//0
a.fun(3);//0
var b=fun(0)//undefined
//b:{
// fun:function(m){//(n=0)
// return fun(m,n);
// }
//}
.fun(1)//0
//{
// fun:function(m){//(n=1)
// return fun(m,n);
// }
//}
.fun(2)//1
//{
// fun:function(m){//(n=2)
// return fun(m,n);
// }
//}
.fun(3);//2
var c=fun(0)//undefined
//c:{
// fun:function(m){//(n=0)
// return fun(m,n);
// }
//}
.fun(1);//0
//c:{
// fun:function(m){//(n=1)
// return fun(m,n);
// }
//}
c.fun(2);//1
c.fun(3);//1
闭包特性:
1.函数返回嵌套的函数形成闭包2.闭包内部可以访问外部的参数和变量
3.外部参数和变量在被闭包引用时不会被垃圾回收机制回收闭包优点:
1.可避免变量对全局的污染
2.允许函数私有成员的存在
3.允许变量长驻内存闭包缺点:
由于变量常驻内存,增大内存使用量,使用不当很容易造成内存泄漏。闭包应用场景:
1.采用函数引用方式的setTimeout调用
2.将函数关联到对象的实例方法
3.封装相关的功能集