百度空间 | 百度首页 
 
查看文章
 
发个Javascript闭包的问题
2008-09-27 17:59

关键字: Javascript 闭包

说实话我还是不很理解这个闭包的概念,总的来说感觉闭包就是一个函数所要引用的执行环境~

好,先不废话,出题(厄,也是从网上搜罗来的):

var div = document.getElementById("testDiv");
var events = {onclick: "clicked", onchange: "changed",   onmouseover: "mouse over"};

for(e in events){
div[e]
= function(){
     alert(events[e]);
};
}

上段代码所要表达的意思很明确,就是给这个testDiv加上3个事件处理函数,分别alert clicked,changed和mouse over. 但是实际运行的时候发现,不管哪个事件被触发,弹出来的alert都是 mouse over. 请问,到底哪里错了?该怎么改~

诸位先想,等会我会给出正确写法,虽然我自己也还不是很明白。

-----------------------------------------------------

我看到这段代码的时候大约能觉得他写错了,也知道哪里错了,但不知道错误的执行结果为什么是那样,也不知道该怎么写才对(我遇到过这种问题,都是使用一种不是很雅的方法解决的。)

好,正确的写法上场(前两句一样,所以只写不一样的部分):

for(e in events){
div[e]
= function(e){
  
return function(){
          alert(events[e]);
   };
}(e);
}

诸位看官…… 那个,反正我是没太懂,晕呼了。 这个问题涉及到Javascript的闭包概念…… 而闭包的官方解释有太头像太拗口……没理解。

如果各位有什么比较容易理解的闭包解释,欢迎跟帖,不胜感激……


类别:脚本 | 添加到搜藏 | 浏览() | 评论 (2)
最近读者:
 
网友评论:
1
2009-01-17 12:57 | 回复
for(e in events){ div[e] = function(){ alert(events[e]); }; } 函数访问了外部的变量。 当函数被真正执行的时候,外部变量e遍历完成已经是onmouseover 所以div挂接的函数体都以e为onmouseover获得执行。 for(e in events){ div[e] = function(e){ return function(){ alert(events[e]); }; }(e); } 这个有两层函数的套接。 可以这样理解,每次遍历都是外层函数: function(e){ return function(){ alert(events[e]); }; } 以e为参数 (e); 调用运行获得的结果 return function(){ alert(events[e]); 挂接给div[e]。 所以把代码改成下面这样仍然是正确的 for(e in events){ div[e] = function(f){ return function(){ alert(events[f]); }; }(e); } 所以,可以看出其实是有两种e,内层函数其实访问的是外层函数的 传入参数,而不是外面在遍历的e。 外层函数每次遍历以不同的e值获得调用的时候,会在内部构造 一个参数变量保存e。该变量由于被内层函数引用,所以外层函数 执行完成后没有被销毁,成了一个很独特的仅能被内层函数访问的 '私有'变量。这
 
2
2009-01-17 12:58 | 回复
个好像就是所谓的js闭包吧。 有几次遍历就产生了几个这样的不同值的'私有'变量,被挂接给div的 内层函数各自引用。 从而当div上的事件触发,挂接的函数被执行的时候,都有各自的'私有'变量 可以使用,最终产生了我们想要的结果。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     
 
精彩相册
   
     

©2009 Baidu