函数是一等公民
函数式编程中,函数被当作一等公民,可以去任何值去的地方,很少有限制。
例如
函数可以与数字一样存储为变量
var fortytwo = function(){ return 42; }
函数与数字一样可以存储为数组的一个元素
var fotytwos = [42,function(){ return 42}]
函数与数字一样可以作为对象的成员变量
var fortytwos = { number:42,fun:function(){ return 42;}}
函数与数字一样可以在使用的时候被直接创建出来
42 + ( function(){ return 42});
函数与数字一样可以被传递给另外一个函数
function weirAdd(n,f){ return n + f()};
weirdAdd(42,function(){ return 42;})
函数与数字一样可以被另外一个函数返回
return 42;
return function(){ return 42;}
高阶函数
- 以一个函数作为参数
- 返回一个函数作为结果
例如:
_.each(["boy","girl","decision"],function(word){
console.log(word.charAt(0).toUpperCase() + word.substr(1));
});
Aplicative编程
Applicative编程定义为函数A作为参数提供给函数B.三个典型的例子是map,reduce和filter.
var nums = [1,2,3,4,5];
function doubleAll(array){
return _.map(array,function(n){
return n *2;
});};
doubleAll(nums); function average(array){
var sum = _.reduce(array,function(a,b){return a + b;});
return sum / _.size(array);
}
average(nums);
function onlyEven(array){
return _.filter(array,function(n){
return (n%2) === 0;
});
}
onlyEven(nums);
_.map 遍历集合并对其每一个值调用一个函数,反悔结果的集合
_.reduce 利用函数将值的集合合并成一个值,该函数接受一个积累值和本次处理的值
_.filter 对集合的每一个值调用一个谓词函数(返回true或false的函数),抽取谓词函数返回true的值的集合。
_.reduceRight 从右到左的运算
_.find 接受一个集合和一个谓词函数,并返回该谓词为true时的第一个元素
_.find(['a','b',3,'d'],_.isNumber) //=> 3
reject 本质上是_.filter的逆
all 接受一个集合和一个谓词
_.all([1,2,3,4],_.isNumber); //=>true
any 接受一个集合和一个谓词
_.any([1,2,'c',4],_.isString); //=>true
sortBy,groupBy和countBy
var people = [{name:"Rick",age:30},{name:"Jaka",age:24}];
_.sortBy(people,function(p){ return p.age}); //=>[{"name":"Jaka",age:24},{name:"Rick",age:30}];
var albums=[{title:"Sabbatch Bloody Sabbatch",genre:"Metal"},{title:"Scientist",genre:"Dub"},{title:"Undertow",genre:"Metal"}];
_.groupBy(albums,function(a){ return a.genre});
//=> {
//=> Metal:[{title:"Sabbatch Bloody Sabbatch",genre:"Mental"},
//=> {title:"Undertow",genre:"Metal"}],
//=> Dub:[{title:"Scientist",genre:"Dub"}] }
_.countBy(albums,function(a){ return a.genre});
//=> {Metal:2,Dub:1}