我的编程空间,编程开发者的网络收藏夹
学习永远不晚

手写Compose方法的有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

手写Compose方法的有哪些

本篇内容主要讲解“手写Compose方法的有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“手写Compose方法的有哪些”吧!

前言:为什么要学习这个方法

  • compose简介

  • compose的实现

    • 最容易理解的实现方式

    • 手写javascript中reduce方法

    • redux中compose的实现

  • 参考文章

前言:为什么要学习这个方法

遇到这个方法主要是最近在阅读redux,koa 原理 等多次遇到这个方法,为了更好地理解框架原理,于是深入学习了一下compose的实现。

然后也发现这属于函数式编程的东西,发现函数式编程是进击前端进阶的必经之路,因为像其中的纯函数的概念在redux的reducer中也展示得淋漓尽致,而保留函数计算结果的思想无论是在vue,还是react等其他框架也多处见到。

所以建议有时间可以去看下函数试编程。

接下来,就让我们学习下其中的compose函数吧!

compose简介

compose就是执行一系列的任务(函数),比如有以下任务队列

let tasks = [step1, step2, step3, step4]

每一个step都是一个步骤,按照步骤一步一步的执行到结尾,这就是一个compose

compose在函数式编程中是一个很重要的工具函数,在这里实现的compose有三点说明

  • 第一个函数是多元的(接受多个参数),后面的函数都是单元的(接受一个参数)

  • 执行顺序的自右向左的

  • 所有函数的执行都是同步的

还是用一个例子来说,比如有以下几个函数

let init = (...args) => args.reduce((ele1, ele2) => ele1 + ele2, 0) let step2 = (val) => val + 2 let step3 = (val) => val + 3 let step4 = (val) => val + 4

这几个函数组成一个任务队列

steps = [step4, step3, step2, init]

使用compose组合这个队列并执行

let composeFunc = compose(...steps)  console.log(composeFunc(1, 2, 3))

执行过程

6 -> 6 + 2 = 8 -> 8 + 3 = 11 -> 11 + 4 = 15

所以流程就是从init自右到左依次执行,下一个任务的参数是上一个任务的返回结果,并且任务都是同步的,这样就能保证任务可以按照有序的方向和有序的时间执行。

compose的实现

好了,我们现在已经知道compose是什么东西了,现在就来实现它吧!

最容易理解的实现方式

思路就是使用递归的过程思想,不断的检测队列中是否还有任务,如果有任务就执行,并把执行结果往后传递,这里是一个局部的思维,无法预知任务何时结束。直观上最容易理解。

const compose = function(...funcs) {   let length = funcs.length   let count = length - 1   let result   return function f1 (...arg1) {     result = funcs[count].apply(this, arg1)     if (count <= 0) {       count = length - 1       return result     }     count--     return f1.call(null, result)   } }

删繁就简来看下,去掉args1参数

const compose = function(...funcs) {   let length = funcs.length   let count = length - 1   let result   return function f1 () {     result = funcs[count]()     if (count <= 0) {       count = length - 1       return result     }     count--     return f1(result)   } }

这就好看很多,我们假设有三个方法,aa,bb,cc

 function aa() {     console.log(11); }  function bb() {     console.log(22); } function cc() {     console.log(33);     return 33 }

然后传入compose

compose(aa,bb,cc)

此时count = 2,则下面其实是执行cc

result = funcs[count]()

然后count--。再递归执行f1,则下面其实就是执行bb

result = funcs[count]()

这样,就实现了 从funcs数组里从右往左依次拿方法出来调用,再把返回值传递给下一个。

后面的步骤同理。

这其实是一种面向过程的思想

手写javascript中reduce方法

为什么要手写?其实你要是能够很熟练的使用reduce,我觉得不必手写reduce,只是我觉得熟悉一下reduce内部的实现可以更好地理解后面的内容,况且  也不会太难呀!

function reduce(arr, cb, initialValue){        var num = initValue == undefined? num = arr[0]: initValue;        var i = initValue == undefined? 1: 0        for (i; i< arr.length; i++){            num = cb(num,arr[i],i)        }'        return num    }

如代码所示,就是先判断有没有传入初始值,有的话,下面的循环直接 从i = 0开始,否则i=1开始。

如果没有传入初始值,num就取 数组的第一个元素。这也是说明了为什么传入初始值,i就=1,因为第一个都被取出来了,就不能再取一次啦啦啦!

下面使用我们写的reduce方法

function fn(result, currentValue, index){        return result + currentValue    }        var arr = [2,3,4,5]    var b = reduce(arr, fn,10)     var c = reduce(arr, fn)    console.log(b)   // 24

好了 ,没毛病,既然我们了解了reduce原理,就看看下面的redux中compose的实现吧

redux中compose的实现

function compose(...funcs) {     if (funcs.length === 0) {         return arg => arg     }      if (funcs.length === 1) {         return funcs[0]     }     debugger     return funcs.reduce((a, b) => (...args) => a(b(...args))) }

很简短,非常的巧妙,但是不是很不好理解。不过没关系。

依旧通过例子来讲解。

function aa() {     console.log(11); }  function bb() {     console.log(22); } function cc() {     console.log(33); }

假设只有这三个方法,我们怎样才能先执行cc再执行bb,再执行aa呢?没错,可以直接写

aa(bb(cc()))

就是这样,非常巧妙,不仅完成了执行顺序,还实现了前一个方法执行返回的结果传递给了下一个即将要执行的方法。

而下面这段代码所做的就是将funcs数组[aa,bb,cc],转化成aa(bb(cc()))

funcs.reduce((a, b) => (...args) => a(b(...args)))

怎么办到的?

看看下面的解释:

reduce内部第一次执行返回的结果是 一个方法

(...args) => aa(bb(...args))

我们现在把这个方法简化成dd,即

dd = (...args) => aa(bb(...args))

reduce内部第二次执行的时候,此时的a 是 上一次返回的dd方法,b是cc

所以执行结果是

(...args) => dd(cc(...args))

而dd(cc(...args))不就是先执行cc再执行dd吗?而dd就是执行bb再执行aa。

我的天,!这不是俄罗斯套娃吗!没错 redux中的compose的实现原理就是套娃哈哈哈!

到此,相信大家对“手写Compose方法的有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

手写Compose方法的有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

手写Pollyfill有哪些

这篇文章主要介绍了手写Pollyfill有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇手写Pollyfill有哪些文章都会有所收获,下面我们一起来看看吧。new测试用例:function Fn (name
2023-06-27

编写CSS的方法有哪些

这篇文章主要讲解了“编写CSS的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“编写CSS的方法有哪些”吧!  CSS正在改变网站设计的进程。为迎合不断增长的倾向于CSS的设计人员的
2023-06-08

docker compose基本语法有哪些

今天小编给大家分享一下docker compose基本语法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。先来看一份 d
2023-07-05

文件写入的方法有哪些

这篇文章主要讲解了“文件写入的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“文件写入的方法有哪些”吧!0.什么是流?Java 中的“流”是一种抽象的概念,也是一种比喻,就好比水流一
2023-06-15

linux写文件的方法有哪些

本文小编为大家详细介绍“linux写文件的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux写文件的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。linu
2023-03-10

android compose的功能有哪些

Android Compose 是一种用于构建用户界面的声明式 UI 工具包。它提供了一系列功能,包括:1. 声明式 UI:使用 Kotlin 语言编写的 Compose 代码,使得构建界面更加简单和直观。2. 即时预览:通过 Compos
2023-10-10

pandas写入excel有哪些方法

pandas写入excel的方法有:1、安装所需的库;2、读取数据集;3、写入Excel文件;4、指定工作表名称;5、格式化输出;6、自定义样式。Pandas是一个流行的Python数据分析库,提供了许多强大的数据清洗和分析功能,要将Pan
pandas写入excel有哪些方法
2023-11-22

Python重写父类的方法有哪些

这篇文章主要介绍了Python重写父类的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python重写父类的方法有哪些文章都会有所收获,下面我们一起来看看吧。1.基础应用class Animal(ob
2023-07-05

Linux的脚本编写方法有哪些

这篇文章主要介绍了Linux的脚本编写方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的脚本编写方法有哪些文章都会有所收获,下面我们一起来看看吧。code 1#!/bin/sh脚本的第一行,看
2023-06-17

php写入文件的方法有哪些

使用file_put_contents函数$file = 'file.txt';$content = 'Hello, world!';file_put_contents($file, $conte
php写入文件的方法有哪些
2024-03-15

python文件读写的方法有哪些

Python文件读写的方法有以下几种:1. 使用open()函数打开文件,并通过read()方法读取文件内容。```pythonfile = open('filename.txt', 'r')content = file.read()fil
2023-09-13

android compose的优缺点有哪些

Android Compose是一种用于构建用户界面的声明性UI工具包,它具有以下几个优点和缺点:优点:1. 声明性:Android Compose使用类似于编写HTML或XML的方式来构建UI界面,使得代码更加清晰、易于阅读和维护。2.
2023-10-19

css中书写注释的方法有哪些

css中书写注释的方法有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网页的样
2023-06-06

C#读写xml文件的方法有哪些

在C#中读写XML文件的方法有以下几种:使用XmlDocument类:XmlDocument类是System.Xml命名空间中的一个类,可以用于读取、创建和修改XML文档。可以使用Load方法来加载XML文件,使用SelectNodes和S
C#读写xml文件的方法有哪些
2024-03-01

iframe写法有哪些

1. HTML标签方式:使用``标签,其中src属性指定要嵌入的页面地址。```html```2. JavaScript方式:使用JavaScript代码动态创建iframe元素,并设置其src属性。```javascriptvar ifr
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录