作者在 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]);
};
}
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: "
var events = {onclick: "clicked", onchange: "changed", onmouseover: "
文章评论,共0条
文章归档
最新评论
- diytz:我自己保存咋地了,用得着说无耻么,笑
- sdlklhd:学习了[emot]1[/emot]
- sdlklhd:无法下载啊
- diytz:我是转载