闭包解释
当内部函数被保存到外部时,会形成闭包,闭包会导致原有作用域链不释放,导致内存泄露(解释: 内存被占用,内存就变小了)
闭包作用
1实现共有变量(函数累加器)
2可以做缓存(存储结构)(eater)
3可以实现封装,属性私有化(Person())
4模块化开发,防止污染全局变量
看下面例子:
function a() { var a = 100 function b() { a++ console.log(a) } return b } var demo = a() //b带着作用域链出来(形成了闭包) b defined 0 : aAO 1 : GO demo() //101 //b执行 b doing 0 : bA0 1 : aAO 2 : GO 执行完销毁bAO 0 : aAO 1 : GO demo() //102 //b执行 b doing 0 : bA0 1 : aAO 2 : GO 执行完销毁bAO 0 : aAO 1 : GO
闭包会导致多个执行函数公用一个公有变量,看一下例子
function test() { var arr = [] for(var i = 0; i < 10; i++) { arr[i] = function() { console.log(i) } } return arr } var myArr = test() for(var j = 0; j < 10; j++) { myArr[j]() //输出10个10 公用同一个testAO }
为了避免公用一个作用域,可以通过立即执行函数给每一个arr[i]独立的作用域,如下改造例子
function test() { var arr = [] for(var i = 0; i < 10; i++) { (function(a) { arr[a] = function() { console.log(a) } }(i)) } return arr } var myArr = test() for(var j = 0; j < 10; j++) { myArr[j]() //输出1,2,3...8 每个执行函数有对应的一个立即执行函数的AO,每个AO的互相独立 }
闭包变量私有化
var inherit = (function() { var F = function() {} //变量私有化 return function() { } }())
实际例子如下
function Person(name, wife) { var perpareWife = 'xiaoli' //闭包,私有变量 this.name = name
this.wife = wife this.divorce = function() { this.wife = perpareWife }, this.changePerpareWife = function(target) { perpareWife = target }, this.sayPerpareWife = function() { console.log(perpareWife) } } var person = new Person('lyj', 'xiaozhang') console.log(person.perpareWife) //undefined perpareWife属性是私有的,不能直接访问,只能通过方法去访问
再看一下闭包例子
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1); c.fun(2); c.fun(3);
最后答案 undefined 0 0 0
undefined 1 2 3
undefined 0 1 1
end!!!