2008年3月20日星期四

JavaScript上的闭包(closure): 第二种说法

而Martin Fowler对闭包的介绍却是另外一种解释: 闭包就是一段可作为参数传递的代码。从他提供的示例来看只是个匿名函数,跟嵌套函数没有什么关系,其他人也给出了C#PythonJavaScript上的例子,却跟上面的不一样。
  1. Array.prototype.select = function(func)
  2. {
  3. var ary = [];
  4. for (var i = 0; i < this.length; ++i)
  5. {
  6. if (func(this[i]))
  7. ary[ary.length] = this[i];
  8. }
  9. return ary;
  10. };
  11. function managers_noclosure(emps) {
  12. var result = [];
  13. for (var i = 0; i < class="delimiters1">)
  14. {
  15. var e = emps[i];
  16. if (e.isManager) result[result.length] = e;
  17. }
  18. return result;
  19. }
  20. function managers(emps)
  21. {
  22. return emps.select(function (e){ return e.isManager; });
  23. }

而现在嚷嚷得比较厉害的Java支持也是依照这种概念: http://www.infoq.com/cn/news/2007/09/catching-up-with-closures

按照这种定义,闭包非常类似于C语言中的函数指针、C++里面的模板函数、Java中的内嵌类,虽然Martin Fowler在他文章里也在说明闭包跟这些概念的不同时提到了运行环境的问题,但似乎没有什么说服力,至少从例子上是看不出来的。

个人感觉,前面一种说法是正确的,这种说法不大对。虽然Martin Fowler的名气很大。

没有评论: