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的作用域,这样也就形成了一个环路,就形成了一个闭包