一、闭包:
如下就是一个闭包程序:
counter 里面 函数add 调用外部变量,此时就会产生闭包。
function counter(){
var counter=0;
function add(){
return "当前的人数:"+(++counter);
}
return add;
}
var login_counter=counter(); //闭包导致add()会留在内存 login_counter指向add方法,内存回收只能使用login_counter=null
console.log(login_counter());
console.log(login_counter());
console.log(login_counter());
login_counter=null //add函数不在有变量指向,变成垃圾对象竟会被回收
返回结果:
闭包的作用:
1、使函数内部变量在函数执行完成后仍然存活于内存中(延长了局部变量的生命周期)
2、让函数外部变量可以操作(读写)到函数内部的数据(变量/函数)
闭包的生命周期:
产生:在嵌套内函数定义执行完成时就已经产生(并不是在闭包函数调用是才产生,函数定义的时候就已经产生)
死亡:嵌套的函数成为垃圾对象时
二、闭包的应用:
闭包的应用主要用在JS模块中:
如下所示 mymode1.js 中定义了一个模块:
function mymod1(){
var counter=0;
function Login(){
return ++counter;
}
function Quit(){
return --counter;
}
return {
Login:Login,
Quit:Quit
}
}
调用如下:
<script src="mymode1.js"></script>
<script>
var module=mymod1();
console.log(module);
console.log(module.Login());
console.log(module.Login());
console.log(module.Login());
console.log(module.Login());
console.log(module.Quit());
module=null; //释放内存
</script>
另外一种更加流行的写法mymode2.js:
(function(window){
var counter=0;
function Login(){
return ++counter;
}
function Quit(){
return --counter;
}
window.mymod2={
Login:Login,
Quit:Quit
};
})(window)
调用更简洁:
<script src="mymode2.js"></script>
<script>
console.log(mymod2.Login());
console.log(mymod2.Login());
console.log(mymod2.Login());
console.log(mymod2.Login());
console.log(mymod2.Quit());
mymod2=null;//释放内存
</script>
</script>
三、内存泄漏和内存溢出
内存泄漏:变量无用后还在内存中就会造成内存泄露,大部分不会造成程序崩溃,但是大量的内存泄漏会造成可供程序分配的内存越来越小。进而导致内存溢出报错
例如 变量a 没有在函数内申明 a 将会导致a成为全局变量常驻内存,导致内存泄漏(意外的全局变量):
function fn(){
a=1;
console.log(a);
}
fn();
闭包也会造成内存泄漏:
function fn(){
var a=new Array(100000);
function test(){
console.log(a);
}
return test;
}
var t=fn();
//t 没有设置成NULL 那么a数组常驻内存 造成内存泄漏
定时器使用不当,没有及时清理也会造成内存泄漏
内存溢出:当程序运行需要的内存超过了可供程序分配的内存时,就会造成内存溢出
<script>
var obj={};
for(var i=0;i<10000;i++){
obj[i]=new Array(100000);
}
//大量空数组造成内存溢出,浏览器直接崩溃
</script>
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!