js中的闭包
- 什么是闭包:当内部函数保存到外部时,导致原有的作用域链不被释放,闭包容易造成内存泄露
function demo(){ //demo()的作用域 demo --[{AO}{GO}] 即自己的作用域和全局的作用域
var a;
function b(){ //b()的作用域 b -- [{AO}{DemoAo}{GO}] 自己的作用域和父级的作用域
console.log('b')
}
return b //内部函数被保存到外部
}
var c = demo() //正常情况下dmeo()执行完后,AO会被垃圾回收机制回收,但是因为存在b()还在用dmeo()的AO,所以不会被垃圾会收机制给回收
// c是一个全局的引用,所以只有等到全局结束后demo的Ao才会被释放
c()
- 闭包的作用
2.1 实现公有变量的累加
function demo(){
var a = 0;
function test(){
a ++;
console.log(a)
}
return test
}
var c = demo()
c() //1
c() //2
c() //3
//a 每次执行会在原来的基础上增加一次, 原因是demo的AO,被保存到外部后就不会再次生成,所以c执行都拿着原来的demo的AO在自加
2.2 可以做缓存
function num(){
var a = 100;
function add(){
a ++;
console.log(a)
}
function sub(){
a --;
console.log(a)
}
return [add, sub]
}
var demo = num() //说明两个用的是同一个AO
demo[0](); //101
demo[1](); //100
demo[0](); //101
2.3 可以实现封装,属性私有化,模块化开发防止变量污染全局
(
function(doc){
var a = 100; // a就只可以在obj内使用不会污染全局变量
var obj = {
add: function(a, b){
return a + b
},
sub:function(){
return a - b
}
}
window.obj = obj
}(1)
)
console.log( obj.add(3, 5))