代码改变世界

理解Ruby 程序块与Javascript 匿名函数

2012-10-05 17:43  h63542  阅读(630)  评论(0)    收藏  举报

上篇《Ruby Module与Scala Traits区别》整理了了Ruby Module特性与Scala中Traits的区别,本文分析一下Ruby中重要特性代码块与Javascript中匿名函数的异同,整理如下:

Ruby是一门彻底的面向对象语言,本身不具备函数式语言的一些特性,在函数式编程中函数是语言一等公民(first class),函数可以作为参数、返回值等形式出现,而面向对象语言中是没有函数式编程中的函数概念,Ruby、java等面向对象语言中的函数总是和某个对象紧密结合,Ruby中的函数不能作为参数、返回值形式存在。 

Ruby为了能够具备函数式编程中高阶函数的特性,引入了程序块(block)的概念,弥补面向对象语言特性的不足(Java中匿名类也算一种类似概念,但是比程序块复杂),从本质上讲Ruby中以程序块为参数的函数与函数式编程语言中高阶函数一样,都是支持接受函数作为参数的函数。

 

Javascript支持部分的函数式编程特性,Javascript中函数具备函数式编程对函数的定义,函数作为与基本类型同等地位的一等公民,可以作为变量、参数、返回值多种形式出现。

简单对比:

  相同     不同
Javascript Function  

都为处理逻辑复用机制

都可以作为参数传递给方法

都支持闭包

 

需要function关键字声明

 

Ruby Block 不需要特殊关键字声明,只需要正常的do end包围或者{包围}

Ruby程序块例子:

arr.each do |item|
  break if item > 2
  puts item
end

Javascript匿名函数例子:

var arr = [1, 2, 3, 4];
$.each(arr, function(index, value) { 
    console.log(value); 
});

 

 

总体来说两者差异不大,可以说Ruby作为一门纯面向对象语言吸收了函数式编程中高阶函数的特性,使Ruby编程更加简洁和强大,而Javascript中函数特性为标准函数式编程特性