| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 前端开发之函数式编程 -> 正文阅读 |
|
[JavaScript知识库]前端开发之函数式编程 |
通用的函数式编程语言,是Haskell,被函数式原教旨主义者认为是纯函数式语言。函数式编程的思想也不断影响着传统编程语言,比如Java 8开始支持lambda表达式,而函数式编程的大厦最初就是基于lambda计算构建起来的。函数式编程对于前端来说是必选项,后端则不必。 React框架的组件从很早开始就是不仅支持类式组件,也支持函数式的组件。而后React Hooks的出现,使得函数式编程思想越来越变得不可或缺。 无副作用这是函数式编程的精髓所在。 无副作用的函数应该符合下面的特点:
数学函数就是如此的:
无副作用函数拥有三个巨大的好处:
组合函数在会无副作用的函数之后,需要好的将这些函数组合起来。 上述的 sqr3 函数有个问题,如果不是number类型,计算就会出错。按照命令式的思路,我们可能就直接去修改sqr2的代码,比如改成这样:
或者是我们在设计sqr3的时候就先预留出来一个预处理函数的位置,将来要升级就换这个预处理函数,主体逻辑不变:
????容器封装函数能力如果我们想给其他的函数也复用这个isNum的能力,可以封装一个容器对象来提供这个能力:
这样,我们不管拿到一个什么对象,用其构造一个MayBeNumber对象出来,再调用这个对象的map方法去调用数学函数,就自带了isNum的能力:
可以发现,输出值从NaN变成了0。而且封装到对象中的另一个好处是可以用"."多次调用了。 再者,使用对象封装之后的另一个好处是,函数嵌套调用跟命令式是相反的顺序,而用map则与命令式一致,先执行的先写:
of 封装 new上面的封装到对象中,但是函数式编程还搞出来new对象再map,最好是构造对象也是个函数。给它定义个 of 方法:
再来看下另一种情况,我们处理返回值的时候,如果有Error,就不处理Ok的返回值,可以这么写:
这是一种容器的设计模式:
我们可以把这个设计模式叫做Functor函子。如果这个容器还提供一个of函数将值转换成容器,那么它叫做Pointed Functor。比如 JavaScript 中的Array类型。 简化对象层级借助Result结构,对sqr3的返回值进行格式化。如果是数值的话,Ok是数值,Err是undefined。如果非数值的话,Ok是undefined,Err是0:
返回的是一个嵌套的结果,但是我们需要的是子Result的值。需要个Result 加一个 join函数:
不严格地讲,像Result这种实现了flatMap功能的 Pointed Functor,就是传说中的Monad。 偏函数和高阶函数函数式编程与命令行编程体感上的最大区别:
如何用函数式方法实现一个只执行一次有效的函数? once是一个高阶函数,返回值是一个函数,如果done是false,则将done设为true,然后执行fn。done是在返回函数的同一层,所以会被闭包记忆获取到:
可以发现,第二次调用init_data()没有发生任何事情。 递归与记忆递归是函数式编程中比较复杂的,最简单的递归就是阶乘:
如此会重复计算好多次,效率较低,应该使用动态规划或者缓存记忆。没错,我们可以封装一个叫memo的高阶函数来实现这个功能:
?使用memo的后阶乘:
言归前端,React Hooks 中的 useMemo就是使用的这种记忆机制:
总结在日常使用中,需要记住这几点:
|
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:10:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |