JS函数式编程

一、概念相关

  1. “函数式编程”是这种编程典范,它将电脑运算视为函数的计算。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要;和过程化编程相比,函数式编程里,函数的计算可随时调用。
  2. 函数式编程的重点是函数的定义而不是状态机(state machine)的实现
  3. 函数式概念的运用,例如:扩展数组排序、动态HTML生成的优美代码、系列函数的应用。

二、应用概念

1、高阶函数

可以操作其它函数的函数,被称为高阶函数。利用高阶函数可以简化操作。

三、应用代码

  1. 扩展数组排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    var a = {
    value: 1,
    date: 2001
    }
    var b = {
    value: 2,
    date:2002
    }
    var c = {
    value: 3,
    date:2003
    }
    var str = [a,c,b];
    var str2 = ['zx','z','yz'];
    str2.sort();
    console.log(str2);
    str.sort(function(x,y){
    return x.date - y.date;
    });
    console.log(str);
  2. 系列函数应用

1
2
3
4
5
6
7
8
9
Function.prototype.sequence=function(g) {
var f=this;
return function() {
f();g();
}
};
function alertFrst() { alert('First!'); }
function alertSec() { alert('Second!'); }2
setTimeout( alertFrst.sequence(alertSec), 5000);

一组函数作为回调函数
以上是文章摘要 阅读更多请点击——>右下角的more 以下是余下全文

  1. 匿名函数
1
2
3
var averageF = function(x,y){
return (x+y)/2;
}

通过匿名函数,没有必要把函数一直放在内存中,所以使用匿名函数更加有效率。

  1. “短路”条件调用
1
2
3
4
var f = false;
var t = true;
var z = (f&&4)||(t&&2);
console.log(z);
  1. 规约函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function forEach(array, func){
for(var i = 0; i<array.length;i++){
func(array[i]);
}
}
function reduce(combine, base, array){
forEach(array, function(value){
base = combine(base, value);
});
return base;
}
function countZeros(count, value){
return value == 0? (count + 1):count;
}
function add(sum, value){
return value + sum;
}
var a = [1,2,3,4,0];
console.log(reduce(countZeros, 0, a));
console.log(reduce(add, 0, a));
  1. 分布应用,函数的一个操作符给定。例如:对数组中的每一个元素都+1的操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function forEach(array, func){
for(var i = 0; i<array.length;i++){
func(array[i]);
}
}
function reduce(combine, base, array){
forEach(array, function(value){
base = combine(base, value);
});
return base;
}
function countZeros(count, value){
return value == 0? (count + 1):count;
}
function add(sum, value){
return value + sum;
}
function map(func, array){
var result = [];
forEach(array, function(value){
result.push(func(value));
});
return result;
}
var ops = {
"+": function(x,y){return x+y},
"-": function(x,y){return x-y},
"*": function(x,y){return x*y},
"/": function(x,y){return x/y}
};
function partial(func){
var knowArgs=arguments;
return function(){
var realArgs=[];
for(var i = 1; i < knowArgs.length; i++){
realArgs.push(knowArgs[i]);
}
for(var i = 0; i < arguments.length; i++){
realArgs.push(arguments[i]);
}
return func.apply(null, realArgs);
}
}
var a = [1,2,3,4,0];
console.log(map(partial(ops["+"], 1), a));