首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

js闭包的一些考虑

2012-08-24 
js闭包的一些思考js闭包问题曾经不止一次的困扰过我,在我反复的看了一些资料以后,有以下体会,希望与大家分

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 就没有了指向,等待被垃圾回收……

?

?

?

以上“言论”为个人理解,不当之处,欢迎拍砖……

热点排行
Bad Request.