函数式编程是一种方案简单、功能独立、对作用域外没有任何副作用的编程范式。
1)功能独立——不依赖于程序的状态(比如可能发生变化的全局变量);
2)纯函数——同一个输入永远能得到同一个输出;
3)有限的副作用——可以严格地限制函数外部对状态的更改。
函数式编程术语
Callbacks 是被传递到另一个函数中调用的函数。 你应该已经在其他函数中看过这个写法,例如在 filter 中,回调函数告诉 JavaScript 以什么规则过滤数组。
函数就像其他正常值一样,可以赋值给变量、传递给另一个函数,或从其它函数返回,这种函数叫做头等 first class 函数。 在 JavaScript 中,所有函数都是头等函数。
将函数为参数或返回值的函数叫做高阶 ( higher order) 函数。
当函数被传递给另一个函数或从另一个函数返回时,那些传入或返回的函数可以叫做 lambda。
命令式编程
命令式编程是向计算机提供一套执行任务的声明。
命令式编程常常改变程序状态,例如更新全局变量。
相反,函数式编程是声明式编程的一种形式。 通过调用方法或函数来告诉计算机要做什么。
函数式编程的核心原则之一是不改变任何东西。
变化会导致错误。 如果一个函数不改变传入的参数、全局变量等数据,那么它造成问题的可能性就会小很多。
回想一下,在函数式编程中,改变或变更叫做 mutation,这种改变的结果叫做“副作用”(side effect)。 理想情况下,函数应该是不会产生任何副作用的 pure function。
函数式编程的另一个原则是:总是显式声明依赖关系。
如果函数依赖于一个变量或对象,那么将该变量或对象作为参数直接传递到函数中。
这样做会有很多好处。 其中一点是让函数更容易测试,因为你确切地知道参数是什么,并且这个参数也不依赖于程序中的任何其他内容。
其次,这样做可以让你更加自信地更改,删除或添加新代码。 因为你很清楚哪些是可以改的,哪些是不可以改的,这样你就知道哪里可能会有潜在的陷阱。
最后,无论代码的哪一部分执行它,函数总是会为同一组输入生成相同的输出。
在函数中重构全局变量
函数式编程以函数理论为中心
能够将函数作为参数传递给其他函数,从另一个函数返回一个函数是有意义的
函数在 JavaScript 中被视为 First Class Objects,它们可以像任何其他对象一样使用。 它们可以保存在变量中,存储在对象中,也可以作为函数参数传递。
函数式编程就是创建和使用具有不变性的函数。