概念引入

面向对象编程的思维形式:把事实世界中的事物形象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的分割函数式编程的思维形式:把事实世界的事物和事物之间的分割形象到程序世界(对运算过程进行形象)

高阶函数 (Higher-order function),能够把函数作为参数传递给另一个函数,能够把函数作为另一个函数的返回后果。
应用高阶函数的意义:
形象能够帮咱们屏蔽细节,只须要关注与咱们的指标
高阶函数是用来形象通用的问题
作为参数传递:

function forEach (arr,fn) {    for(let i =0;i<arr.length;++i){        fn(arr[i]);    }}function filter(arr,fn){    let result = [];    for(let i =0;i<arr.length;++i){        if(fn(arr[i])){            result.push(arr[i])        }    }    return result;}const map = (arr, fn) => {    let result = [];    for (let val of arr) {        result.push(fn(val))    }    return result;}const every = (arr, fn) => {    let flag = true;    for(let val of arr){        flag = fn(val);        if(!flag){            break;        }     }    return flag;}

作为返回值

function once(fn){    let done = false;    return function() {        if(!done){            done = true;            return fn.apply(this,arguments);        }    }}let pay = once(function (money){    console.log(`pay ${mondy} RMB`);});// 只付一次pay(5);pay(5);pay(5);

闭包
闭包 (Closure):函数和其四周的状态(词法环境)的援用捆绑在一起造成闭包。
能够在另一个作用域中调用一个函数的外部函数并拜访到该函数的作用域中的成员。
闭包的实质:函数在执行的时候会放到一个执行栈受骗函数执行结束之后会从执行栈上移除,然而堆上的作用域成员因为被内部援用不能开释,因而外部函数仍然能够拜访内部函数的成员。

纯函数:雷同的输出永远失去雷同的输入
一个纯函数与不纯函数的例子
数组的 slice 和 splice 别离是:纯函数和不纯的函数
slice返回数组中指定局部,不会批改原数组,splice对数组进行操作返回该数组,会扭转原数组。
纯函数益处
可缓存,因为纯函数对雷同的输出始终有雷同的后果,所以能够把纯函数的后果缓存起来,比方一个计算圆面积的办法,只用输出半径,就能获取圆面积。
可测试,纯函数让测试更不便
并行处理,在多线程环境下并行操作共享的内存数据很可能会出现意外状况
纯函数不须要访问共享的内存数据,所以在并行环境下能够任意运行纯函数 (Web Worker)

副作用
副作用让一个函数变的不纯,纯函数的依据雷同的输出返回雷同的输入,如果函数依赖于内部的状态就无奈保障输入雷同,就会带来副作用。
所有的内部交互都有可能带来副作用(配置文件,数据库,获取用户输出),副作用也使得办法通用性降落不适宜扩大和可重用性,同时副作用会给程序中带来安全隐患给程序带来不确定性,然而副作用不可能齐全禁止,尽可能管制它们在可控范畴内产生。

举个例子

// 不纯的let mini = 18;function checkAge (age) {  return age >= mini;} // 纯函数function checkAge (age) {  let mini = 18;  return age >= mini;}