“函数式编程”一词有两种含义。
第一个含义是程序操作函数的能力。并非所有语言都可以做到这一点,但 javascript 是可以做到的语言之一。可以将函数分配给变量、将函数传递给参数和返回函数的语言称为函数式编程语言,因此 javascript 是函数式的。
从这个意义上说,如果您查看任何普遍使用回调的现代 javascript 代码,那么您已经在进行函数式编程。
函数式编程的第二个含义是编程风格,其中程序组合的主要方法是函数而不是变量。从这个意义上说,通过避免变量赋值和循环结构(使用递归代替),几乎任何语言都可以以函数式风格使用。
当您查看函数式社区时,他们所说的函数式是第一个含义加上第二个含义的非常强大的版本——也就是说,变量不仅被避免,而且被禁止。Haskell 等语言没有变量的概念。为了处理像 I/O 这样的副作用和可变状态,他们使用了一个叫做 monads 的概念。
你不必走那么远。像 Lisp 和 Forth 这样的经典函数式语言允许使用变量。你只需要尽可能避免它们。
Lisp 和 Forth 风格的函数式编程主要由处理列表/数组驱动,而无需为临时变量分配任何内容。对某些人来说,这种风格更容易阅读。在命令式风格中你会这样做:
var a = [1,2,3];
var b = 0;
for (var i=0;i=a.length;i++) {
b += a[i] * 2;
}
// result is in b
在功能风格中,你会这样做:
[1,2,3].
map(function(x){return x*2}).
reduce(function(x,y){return x+y},0);
从概念上讲,函数式风格看起来像是在对数组应用过滤器,而不是遍历数组。如果您曾经使用过类似的命令行工具,grep
您会发现这个概念非常熟悉。
请注意,我们根本没有在函数式风格中引入任何变量赋值。
函数式风格中的三个核心数组方法/函数是map
:reduce
和filter
. 使用它们,您可以避免 90% 的 for 循环。