js 之闭包泄漏
闭包
定义:闭包即一个函数,什么函数呢?就是能访问另一个函数作用域的函数。常用的方式创建闭包的常见方式,就是在一个函数内部创建另一个函数,即函数return返回函数
function foo(){
var num =0;
return function a(){
num++
console.log('这是一个 闭包',num)
}
}
var bar = foo();//存的是地址
var bar1 = foo();
var bar2 = foo();
//这三个的AO对象是不同的 时间戳不同 地址不同
闭包的作用
-
实现公有变量: eg:函数累加器
function add(){ var count = 0; function demo(){ count++; console.log(count) } return demo; } var counter = add(); counter();//1 counter();//2
-
可以做缓存(存储结构):eg:eater
function eater(){ var food='apple'; var obj = { eat:function(){ if(food){ console.log('I am eating '+food); food=''; }else{ console.log('eat emtpy') } }, push:function(myfood){ food=myfood; } } return obj } var eat1 = eater(); eat1.eat(); eat1.eat(); eat1.push('pear'); eat1.eat();
-
可以实现封装,属性私有化:eg:new Person();
封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
4.模块化开发,防止污染全局变量
闭包优点
1外部函数可以访问内部函数的变量
2变量不会污染 foo()执行一次;会形成一个闭包 ;闭包与闭包之间互不干扰。bar bar1 bar2 之间 互不干扰,因为foo每次执行会初始化AO对象 多个AO 多个地址 AO与AO之间彼此独立,所以bar bar1 bar2 操作各自的AO 不是同一个AO。
缺点
变量不能释放导致内存泄露