不变性
在传统的面向对象语言中,x = x + 1
是一种简单而合法的表达方式。但在功能编程中,它是非法的。
功能编程中不存在变量。由于历史记录,存储的值仍称为变量。实际上,它们是常数。一旦 x
取值,它就是生命的价值。
那么,如果变量是常数,那么我们如何改变它的值呢?
函数式编程通过使用更改的值创建记录的副本来处理记录中值的更改。
例如,而不是做:
var numbers = [1, 2, 3];
numbers[0] += 1; // numbers = [2, 2, 3];
你做:
var numbers = [1, 2, 3];
var newNumbers = numbers.map(function(number) {
if (numbers.indexOf(number) == 0)
return number + 1
return number
});
console.log(newNumbers) // prints [2, 2, 3]
功能编程中没有循环。我们使用递归或更高阶函数,如 map
,filter
和 reduce
来避免循环。
让我们在 JavaScript 中创建一个简单的循环:
var acc = 0;
for (var i = 1; i <= 10; ++i)
acc += i;
console.log(acc); // prints 55
通过将 acc
的生命周期从全局变为本地,我们仍然可以做得更好:
function sumRange(start, end, acc) {
if (start > end)
return acc;
return sumRange(start + 1, end, acc + start)
}
console.log(sumRange(1, 10, 0)); // 55
没有变量或循环意味着更简单,更安全和更易读的代码(特别是在调试或测试时 - 在一些语句之后你不需要担心 x
的值,它永远不会改变)。