函数式编程
函数式编程是一种方案简单、功能独立、对作用域外没有任何副作用的编程范式:INPUT -> PROCESS -> OUTPUT。
函数式编程:
1)功能独立——不依赖于程序的状态(比如可能发生变化的全局变量);
2)纯函数——同一个输入永远能得到同一个输出;
3)有限的副作用——可以严格地限制函数外部对状态的更改**。**
介绍一些术语
Callbacks 是被传递到另一个函数中调用的函数。 你应该已经在其他函数中看过这个写法,例如在 filter 中,回调函数告诉 JavaScript 以什么规则过滤数组。
函数就像其他正常值一样,可以赋值给变量、传递给另一个函数,或从其它函数返回,这种函数叫做头等 first class 函数。 在 JavaScript 中,所有函数都是头等函数。
将函数为参数或返回值的函数叫做高阶 ( higher order) 函数。
当函数被传递给另一个函数或从另一个函数返回时,那些传入或返回的函数可以叫做 lambda。
了解纯函数
纯函数的返回结果只依赖其参数
返回值只和函数参数有关,与外部无关。无论外部发生什么样的变化,函数的返回值都不会改变。
// 纯函数 返回结果只依赖于它的参数 x 和 b,foo(1, 2) 永远是 3。今天是 3,明天也是 3,在服务器跑是 3,在客户端跑也 3,不管你外部发生了什么变化,foo(1, 2) 永远是 3。只要 foo 代码不改变,你传入的参数是确定的,那么 foo(1, 2) 的值永远是可预料的。
const a = 1
const foo = (x, b) => x + b
foo(1, 2) // => 3
函数执行的过程中没有副作用
函数执行的过程中对外部产生了可观察的变化,我们就说函数产生了副作用。
例如修改外部的变量、调用DOM API修改页面,发送Ajax请求、调用window.reload刷新浏览器甚至是console.log打印数据,都是副作用。
map() 是一个纯函数,它的输出仅取决于输入的数组和作为参数传入的回调函数。 此外,它接收另一个函数作为它的参数。`
写一个自己的map()
Array.prototype.veMap = function(callback) {
var newArray = [];
this.forEach(a => newArray.push(callback(a)));
return newArray;
};