- 什么是闭包:当内部函数保存到外部时,导致原有的作用域链不被释放,闭包容易造成内存泄露
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))