本笔记经过学习
https://www.ibm.com/developerworks/cn/web/1006_qiujt_jsfunctional/ 后书写,很大部分都相同,但一字一句包括代码都是自己书写。
JavaScript 函数式编程理解笔记 (1)
函数式编程语言特性
在函数式编程中,函数式第一类的对象,也就是说,它不依赖于其他任何对象而可以独立存在,但是在面向对象的语言中,函数是依附于对象的,是对象的一部分。
函数式编程的专用概念
1.匿名函数
在函数式编程中,函数是可以没有名字的。有时为了完成某些事而编写这个函数,但是由于这个函数只是临时性的,所以就没有理由去生成一个顶层的函数对象。如:
function map(array,func){
var res = [];
for(var i = 0; i < array.length; i++){
res.push(func(array[i]));
}
return res;
}
var mapped = map([1,3,5,7,9],function(n){
return n = n + 1;
});
print(mapped);
运行这段代码,会打印:
2,4,6,8,10//数组[1,3,5,7,9]中的每一个元素加1
map中的第二个参数其实就是匿名函数,它对于map函数的第一个参数来说是有作用的,但是对于map函数外的代码,其实是没有作用的,所以只需要匿名即可。
2.柯里化
柯里化是把接受多个参数的函数变成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数。如:
function curring(num){
return function(x){
return num + x;
}
}
var add5 = curring(5);
var add6 = curring(6);
print(add5(1));
print(add6(1));
//结果为:
//6
//7
要注意的是,curring函数接受一个参数,并返回一个函数,这个函数可以像预期那样被调用。而两个变量add5、add6可以保持curring()返回的函数,而这个函数可以接受一个参数,从而返回代码中的 num + x 的值。
3.高阶函数
上文匿名函数中的map函数即是一种高阶函数。map(array,func)已经表明:将func作用于array中的每一个元素,最终返回一个新的array。而map对于array和func的实现是没有预先的假设的,所以这种函数被称为“高阶函数”:
fucntion map = (array,func){
var res = [];
for(var i = 0; i < array.length; i++){
res.push(func(array[i]));
}
return res;
}
var mapped = map([1,3,5,7,9],function(n){
return n += 1;
});
print(mapped); //2,4,6,8,10
var mapped1 =map(["one","two","three","four"],
function(n){
return "("+n+")";
});
print(mapped1); //(one),(two),(three),(four)
mapped和mapped1都调用了map函数,但是结果不同,是因为map参数本身的已经进行了一次抽象,而map函数进行了第二次抽象。高阶的“阶”可以理解为抽象的层次。