闭包是什么
闭包是可以访问另一个函数作用域中变量的函数。简单地说就是定义在一个函数内部的另一个子函数。
闭包有什么用
闭包可以访问到函数内部的变量;从而实现封装。
var Person = function(){
var name = "jax"; //变量作用域为函数内部,外部无法访问
//返回两个闭包函数
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();
Person.name;//直接访问,结果为undefined
Person.getName(); //结果为 jax
Person.setName("jaxhu"); //通过闭包设置person函数内部的变量
Person.getName(); //结果为 jaxhu
通过这个的封装可以实现js中原本没有的类的概念。
var jax1= Person();
jax1.setName("jax1");
john.getName(); //结果为jax1
var jax2= Person();
jax2.setName("jax2");
john.getName(); //结果为 jax2
闭包可以使访问到的那些变量一直保存在内存当中, 实现缓存功能。
闭包有什么缺陷
如果大量因为闭包引用的变量存留在内存中,对于内存的消耗会很大,导致影响产品的性能,遇到这样的情况我们可以在退出函数之前,将不使用的局部变量全部删除。
闭包内this的指向
首先我们要了解,js中this的指向是由它所在函数被调用时的上下文决定的,而不是由它所在函数定义的上下文决定的。
js中this的指向和执行环境和作用域链密不可分,此文不做详述,我们只需要知道,通常情况下闭包中的this都是指向window。
总结
闭包的使用要根据业务场景和具体逻辑来使用。关于闭包中引用的变量会存留在内存中这一点,它既可以是影响你产品性能的一个被忽略的要素,也可以被利用起来实现一些功能。具体情况具体分析,也配合相应的解决方法。