JavaScript详细教程(6) - 函数式编程

JavaScript不是函数式编程语言,但在JavaScript中可以像操控对象一样操控函数,也就说可以在JavaScript中应用函数式编程技术。

使用函数处理数组

假设有一个数组,数组元素都是数字,我们想要计算这些元素的平均值和标准差,若使用非函数式编程风格的话,代码会是下面的样子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var data = [1,1,3,5,5];
//求平均数就是将所有的元素累加后的值除以元素的个数
var total = 0;
for(var i = 0; i<data.length; i++){
total += data[i];
}
var mean = total/data.length;
//求标准差就是每个元素减去平均数之后偏差的平方然后求和
total = 0;
for(var i = 0; i< data.length; i++){
var deviation = data[i]-mean;
total += deviation * deviation;
}
var stddev = Math.sqrt(total/(data.length -1))

可以使用数组方法map()reduce()来实现同样的计算,代码显得极其简洁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var sum = function(x,y){
return x+y;
}
var squre = function(x, y){
return x*y;
}
var data = [1, 2, 3, 4, 5, 6];
//求平均数
var mean = data.reduce(sum)/data.length;
//将数组中的每个元素减去平均值然后返回新的数组
var deviations = data.map(function(x){return x-mean;});
//将返回的新数组调用map函数使求得每个元素的平方然后再返回一个新的数组
//然后再将重新返回的数组调用reduce函数使各元素值相加
var stddev = Math.sqrt(deviations.map(squre).reduce(sum)/(data.length -1));

高阶函数

高阶函数就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个函数,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//这个高阶函数返回一个新的函数,这个新函数将他的实参传入f()
//并返回f的返回值的逻辑非
function not(f){
return function(){
var result = f.apply(this,arguments);
return result;
}
}
//判断x是否为偶数的函数
var even = function(x){
return x % 2 === 0;
};
//一个新函数,所做的事情和even()相反
var odd = not(even);
[1, 1, 3, 5, 5].every(odd); // => true:每个元素都是奇数;

上面的not()函数就是一个高阶函数,因为它接收一个函数作为参数,并返回一个新的函数。

-------------本文到此结束,感谢您的阅读-------------