探究JavaScript函数式编程的乐趣

编程范式是一个由思考问题以及实现问题愿景的工具组成的框架。很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等。

探究JavaScript函数式编程的乐趣

函数式编程范式

函数式编程就像一辆氢燃料驱动的汽车——先进的未来派,但是还没有被广泛推广。与命令式编程相反,他由一系列语句组成,这些语句用于更新执行时的全局状态。函数式编程将计算转化作表达式求值。这些表达式全由纯数学函数组成,这些数学函数都是一流的(可以被当做一般值来运用和处理),并且没有副作用。

探究JavaScript函数式编程的乐趣

函数式编程很重视以下值:
函数是一等要务

我们应该将函数与编程语言中的其他类对象同样对待。换句话说,您可以将函数存储在变量里,动态创建函数,以及将函数返回或者将函数传递给其他函数。下面我们来看一个例子...

探究JavaScript函数式编程的乐趣

一个字符串可以保存为一个变量,函数也可以,例如:

复制代码 代码如下:

var sayHello = function() { return “Hello” };


一个字符串可以保存为对象字段,函数也可以,例如:

复制代码 代码如下:

var person = {message: “Hello”, sayHello: function() { return “Hello” }};


一个字符串可以再用到时才创建,函数也可以,例如:

复制代码 代码如下:

“Hello ” + (function() { return “World” })(); //=> Hello World


一个字符串可以作为输入参数传给函数,则函数也可以:

复制代码 代码如下:

function hellloWorld(hello, world) { return hello + world() }


一个字符串可以作为函数返回值,函数也可以,例如:

return “Hello”; return function() { return “Hello”};

高阶案例

探究JavaScript函数式编程的乐趣

如果函数将其他函数函数作为输入参数或者作为返回值,则称之为高阶函数。刚才我们已经看过了一个高阶函数的例子。下面,我们来看一下更复杂的情况。
例1:

[1, 2, 3].forEach(alert); // alert 弹窗显示“1" // alert 弹窗显示 "2" // alert 弹窗显示 "3”

例2:

function splat(fun) { return function(array) { return fun.apply(null, array); }; } var addArrayElements = splat(function(x, y) { return x + y }); addArrayElements([1, 2]); //=> 3

最爱纯函数

探究JavaScript函数式编程的乐趣

纯函数不会有其他的副作用,所谓的副作用指的是函数所产生的对函数外界状态的修改。比如:

修改某个变量

修改数据结构

对外界某个变量设置字段

抛出例外或者弹出错误信息

最简单的例子就是数学函数。Math.sqrt(4) 函数总是返回2。他不会用到任何其他心寒信息,如状态或者设置参数。数学函数从来不会造成任何副作用。

避免修改状态


探究JavaScript函数式编程的乐趣


函数式编程支持纯粹的函数,这样的函数不能改变数据,因此大多用于创建不可改变的的数据。这种方式,不用修改一个已存在的数据结构,而且能高效的新建一个.
你也许想知道,如果一个纯粹的函数通过改变一些本地数据而生产一个不可改变的返回值,是否是允许的?答案是可以。
在JavaScript中极少的数据类型是默认是不可改变的。String是一个不能被改变的数据类型的例子:

var s = "HelloWorld"; s.toUpperCase(); //=> "HELLOWORLD" s; //=> "HelloWorld"

不可改变状态的好处

•    避免混乱和增加程序的准确性:在复杂系统内,大多数难以理解的Bug是由于状态通过在程序中外部客户端代码修改而导致的。

    •    确立“快速简洁”的多线程编程:如果多线程可以修改同一个共享值,你不得不同步的获取值。这对专家来说都是十分乏味并且易出错的编程挑战。

软件事务内存和Actor模型提供了直接在线程安全方式下处理修改。

使用递归而非循环调用

探究JavaScript函数式编程的乐趣

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgwppp.html