没看懂的一篇文章

作者在 2007-04-21 22:03:00 发布以下内容

最近再学javascript,在闭包这个技术问题上卡住了,不太好理解,今天看了一篇文章,准备以后学明白了 再回头看看,先保存在这里:

出来混,迟早要还。今天写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]);
   };
}

试一下就知道。不管激发events列表里的哪坨事件,alert弹出的窗口里总是"mouse over"。

不明白JavaScript为什么这样处理循环和闭包的关系。哪位老大指点一下? 更新:随便猜一下。JavaScript的Closure环境由静态的句法结构确定。也就是说,代码一旦写成,我们就知道函数的自由变量同哪些环境里的变量绑定。这样说来,上面的循环只申明了一个变量p和一个内部函数,从静态的句法结构来看,我们的确只有一个环境。因此,虽然运行时同一个内函数被调用多次,创建了多个闭包,这些闭包指向的都是同一个环境里的同一个变量。这样同JavaScript规定的闭包语义一致。

阳春版的修改办法是利用函数定义创建新闭包,符合业内名言:任何计算机问题都能通过多加一层抽象解决。:-) Crockford Douglas 把多加的这层函数叫做因子函数(factor function)。

var div = document.getElementById("testDiv");
var events = {onclick: "clicked", onchange: "changed",  onmouseover: "
我的日志 | 阅读 1201 次
文章评论,共0条
游客请输入验证码