javascript闭包的理解

      闭包就是一个表达式(典型的例子就是一个function),这个表达式包含和自由变量,并且和一个环境绑定到一起。就是close的意思。

     想必大家对于简单的垃圾回收机制都有所了解,就是如果一个对象如果没有引用了就会被回收掉,如果两个对象互相引用,就生成了一个环,简单点理解就生成了一闭包。在javascript中,window对象是全局是不会被回收掉的。所以如果一个函数的内部变量被window引用上,就形成了闭包。比如,我们想要一个生成全局生成唯一id的函数,但是又不想把变量定义成全局的变量。我们可以这样写

 var genfun = (function(){

   var i=0;

 return function(){return i++;};

})();

alert(genfun());

alert(genfun());

这样就输出一个自增的函数,并且自增变量i,不是全局的变量,而是在函数内部的。

大家一定要分清楚原型链和作用域链,他们是两个方向的,原型链是js对象的继承模型,而作用链是函数嵌套时,查找对象的寻找路径。继续上面的闭包,首先genfun是被window所引用的,genfun是一个内部函数,是匿名函数的返回函数,而genfun对匿名函数是有引用的,所以匿名函数也是一直会存在的不会被垃圾回收掉,这样i也就会一直存在,这样匿名函数的生命周期也就延长了。由于window持有了内部函数的作用域,而内部函数持有匿名函数的作用域,而匿名函数也持有window的作用域,这样也就形成了一个环路,就形成了一个闭包

 

 

 

 

 

posted on 2013-06-03 09:37  rainbow.zhang  阅读(145)  评论(0编辑  收藏  举报