一、概念
1.闭包的含义
简单了解一下什么是闭包?
闭包:有权访问另一个函数作用域中的变量的函数
引用别人的一句话
理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。
2.闭包的组成
闭包由函数和创建该函数的环境组成的
这个环境由闭包创建时在作用域中的任何局部变量组成的。
3.生成闭包的条件
- 函数嵌套函数
- 内部函数引用了外部函数中的数据(属性、函数)
- 参数和变量不会被回收
二、特点
1.优点
- 能够读取函数内部的变量
- 让这些变量一直存在于内存中,不会在调用结束后,被垃圾回收机制回收
2.缺点
- 函数执行完后,函数内的局部变量没有释放,占用内存时间变长,容易造成内存泄漏
解决方案:退出函数之前,将不使用的局部变量删除。 - 如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。
三、案例
案例1
function test(){
var sum=100;
function a(){
sum++;
console.log(sum);
}
function b(){
sum--;
console.log(sum);
}
return [a,b];
}
var arr=test();
arr[0]();//101
arr[0]();//102
arr[1]();//103
内部函数被返回到外部时产生闭包,当父函数执行完毕后并不会销毁函数内的局部变量。
案例2
<script>
function test(){
var arr = [];
for(var i =0; i<10;i++){
(function(j){
arr[j]=function(){
document.write(j);
}
}(i))//立即执行函数,每次定义都立即执行
}
return arr;
}
var myarr =test();
for(var j=0;j<10;j++){
myarr[j]();
}
</script>