0%

【Js学习笔记】(2)函数式编程

上一篇主要讲述了Js的基本情况以及它的数据类型,而这一篇就开始讲Js的函数部分。

一、函数定义和调用

1.1定义

常规的定义包括这几个部分:

1.关键字function 及 函数名;

2.参数列表,用0括起来;

3.函数体,用{}括起来;

例子:

1
2
3
4
5

function add(a,b){

return a + b;
}

由于Js语言支持动态数据类型,所以可以把函数看成是一个值,赋值给变量。

并且,因为支持匿名函数,所以可以定一个匿名函数赋给一个变量,使其升级成为函数,

例如:

1
var sub = function (a,b){return a - b;}
注意:上面因为是匿名函数,函数名就不存在了,但是赋值后,sub就是该函数的函数名。调用的时候可以直接这样调用:
1
sub(3,2);
### 1.2调用

调用方式同正常语言的调用; 1.3参数arguments

这个关键字是属于每个函数都有的一个参数,里面包含了传入参数的内容,个数等信息;

例如:

arguments.length提供了参数的个数;

arguments[0]、arguments[2]分别访问了传入的第0和2个参数;

所以说,在js里,一个函数就算没有定义传参列表,依旧可以传入参数。而且就算有参数列表的情况下,传入的参数个数超过了列表定义的个数也是可以的,只是分是否defined而已。

二、高阶函数之传参函数

这个名字想必来自于高数里面的高阶函数。它的思想就是将别的函数作为参数传入某个函数中使用。这也是函数式编程的核心之一。

例如:

1
2
3
function abs_max(a, b,abs,max){
return max(abs(a), abs(b));
}

说明:上例子返回a、b中绝对值更大的一个值;

下面讲解下常用的几个将函数作为参数的函数; 2.1 map/reduce

map和reduce都是Array的一个成员函数。其中map是对数组函数映射,reduce是归约(化简)。

两个操作是来自于Google大牛Jeff Dean关于mapreduce的论文,MapReduce: Simplified Data Processing on Large Clusters

map如同函数映射一样,将每个key映射到对应的value的值,而map接收的参数就是我们自己定义的的函数。

reduce是将一系列的数据进行归约,迭代地将前一步的操作的结果与当前Key值进行操作,获得新的结果。 ### 2.2 filter

filter的意思是过滤器,是Array下的一个函数,作用是过滤数组中不符合特征的元素。接收的参数是一个布尔型函数,true时保留元素,false时剔除元素。 ### 2.3 sort

sort是我们常用的排序函数,也是在Array之下。除了默认的排序方式,我们可以传入一个比较函数,自定义确定元素次序。 三、高阶函数之返回函数

同样,高阶函数也可以将函数作为返回值返回给调用位置。 ### 3.1 闭包

闭包是函数式编程的重要概念之一。理解起来偏难,但是实际用起来觉得十分奇妙。

我总结了多篇对其理解:

1.它是函数内部和函数外部的桥梁:将外部的参数传入函数中,在返回中的函数中加入;

2.它使局部变量能够保留在内存中;

3.2 generator

generator,即生成器,实际类似于迭代器iterator。

它利用高阶函数的特性,在返回中的函数中添加了yield语句(类似于return,但是遇到yield会继续执行后面的语句,而return就结束函数运行),使其每次执行都会返回一个值,并更新返回状态(结束或者继续运行),从而能够反复多次运行,直到最终的return才结束。

参考:廖雪峰的JavaScript教程