js闭包的一些思考
js闭包问题曾经不止一次的困扰过我,在我反复的看了一些资料以后,有以下体会,希望与大家分享:
?
1、闭包出现的场景
???????产生闭包至少需要4个元素:外部变量、外层函数、外层函数的局部变量和内层函数,这几个元素的持有关系使得彼此都不会被垃圾回收,从而形成了一个闭环(个人认为这是闭包名字的由来),简单一点说就是外部变量持有内层函数的句柄,内层函数又持有外层函数的变量。看下面函数:
var ou = [];function ouf(){ for(var i=0;i<3;i++){ var obj = {}; obj.num=(function(s){ return function(){ alert(s); } })(i); ou.push(obj); }};ouf();ou[0].num();ou[1].num();ou[2].num();(function(s){?
????????return function(){
???????????????????????alert(s);
?????????????????}
? })(i);
????? 这行代码在js中是将i 作为参数传给外面的匿名函数,并立即执行的意思。为什么这样就能解决闭包的问题了呢,我们可以看到,这里的s其实就是外面函数的局部变量,return function(){?alert(s);?}仍旧是给obj的num属性指向了一个函数,惟一的区别就是此时这个函数里的变量s变成了局部变量。那么从整体来看,全局变量i 在每一次改变之后,将改变后的不同值分别传给了不同obj对象的num函数的局部变量,这样当我们以后执行num函数的时候,实际上访问的是每个obj自己的num函数对应的自身的变量。当ouf()执行完之后,i 就没有了指向,等待被垃圾回收……
?
?
?
以上“言论”为个人理解,不当之处,欢迎拍砖……