诡异的JavaScript Closure
来源:互联网 发布:linux 查看ip地址 编辑:程序博客网 时间:2024/04/30 09:55
出来混,迟早要还。今天写JavaScript代码,才知道一个循环里的函数共享同一闭包。比如下面的代码是错的,不能正确报告每个事件对应的描述:
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 events = {onclick: "clicked", onchange: "changed", onmouseover: "mouse over"};
for(e in events){
div[e] = function(e){
return function(){
alert(events[e]);
};
}(e);
}
当然,如果到处创建因子函数,就繁琐了。所以还是Dojo风格的调用来得清爽:
alert(e);
});
明眼老大们自然可以看出这是函数编程的风格。其实JavaScript本就是采用C语言句法的简化版LISP,异常灵活。如果我们注意利用高端函数(加上闭包),便可像搭建积木那样“拼装”我们的程序,使代码变得干净利落。Dojo框架里实现了各式函数编程常用函数,比如map, reduce, filter, find, hitch, curry, 非常方便。再加上prototype chain, 对inspection的强大支持(光arguments.caller, arguments.callee就让俺爱不释手了),以及call, apply, eval这三个超级函数,在JavaScript里写出功能完善的DSL也变得相对容易。 就算不捣腾DSL,JavaScript也有无数妙用。比如Dojo里处理事件的代码实现了AOP风格的建议功能,让我们随意操纵处理事件的时机,轻松截取任意事件的参数,哪怕是普通JavaScript函数调用的参数。而实现这些功能的代码并不复杂。
从Dojo的实现也可以看出学习多种编程范式的重要性。Dojo里支持函数编程,面向对象编程,Ruby风格的mixin, AOP风格的事件处理等从不同语言借鉴来的功能。如果Dojo的主程Alex Russell只懂JavaScript,就算他能倒背EMCAScript规范,恐怕也写不出Dojo。要享受编程,避免一件本来很美好的事变成体力活,功夫永远在诗外。
- 诡异的JavaScript Closure
- 诡异的JavaScript Closure
- javascript的闭环 closure
- 诡异的JavaScript语法
- JavaScript 诡异的0.01
- Google Closure: 糟糕的JavaScript
- Google Closure: 糟糕的JavaScript
- JavaScript closure的一个问题
- JavaScript 的closure 和 hoisting
- JavaScript的几个诡异问题
- [JavaScript] Google Closure: 糟糕的JavaScript
- JavaScript - Closure
- Javascript Closure
- javascript Closure
- JavaScript Closure
- Javascript Closure
- javascript closure
- JavaScript closure
- 第一次
- 项目愿景讨论
- 如何配置Win 2003的DNS服务器
- Network Protocol for Online Games by Michael Butler/Jennifer Louie/Jorge Pombar
- 比尔盖茨2007年4月在清华大学的演讲
- 诡异的JavaScript Closure
- Java开源GIS平台介绍
- 盖茨微软亚洲领导人论坛演讲实录
- thingking in java 读书笔记---控制程序流
- 我上传的附件资源链接: http://download.csdn.net/user/gxiyv
- test2
- 恶灌满门2007-04-19(聚餐)
- 订饭
- J2ME应用程序架构模型