总结componse函数实现过程

大致特点

  • 参数均为函数, 返回值也是函数
  • 第一函数接受参数, 其他函数接受的上一个函数的返回值
  • 第一个函数的参数是多元的, 其他函数的一元的
  • 自右向左执行

简单实现

第一步: 记录我们传入所有函数的个数

var compose = function (...args) {
var len = args.length // 记录我们传入所有函数的个数
return function f1() {
//
}
}

第二步: 利用游标记录该运行的函数

var compose = function (...fns) {
var len = fns.length // 记录我们传入所有函数的个数
var index = len - 1 // 游标记录函数执行情况, 也作为我们运行fns中的中函数的索引
var reslut // 结果, 每次函数执行完成后, 向下传递
return function f1(...arg1) {
reslut = fns[index].apply(this, arg1)
--index
return f1.call(null, reslut)
}
}

第三步: 完成代码

var compose = function (...fns) {
var len = fns.length // 记录我们传入所有函数的个数
var index = len - 1 // 游标记录函数执行情况, 也作为我们运行fns中的中函数的索引
var reslut // 结果, 每次函数执行完成后, 向下传递
return function f1(...arg1) {
reslut = fns[index].apply(this, arg1)
if (index <= 0) {
index = len - 1 // 再看这篇文章的时候, 不清楚这里处理index的作用
return reslut
} else {
--index
return f1.call(null, reslut)
}
}
}

loadsh实现

直接实现

使用while迭代完成

var flow = function (fns) {
var len = fns.length // 检查所有参数是否为函数
var index = len
while (index--) {
if (typeof fns[index] !== 'function') {
throw new TypeError('Expected a function')
}
} return function (...args) {
var index = 0
// 传入数组为空, 错误的话, 执行后面的啊, 傻瓜, 竟然卡了这么久, 也真是够了
var reslut = len ? fns[index].apply(this, args) : args[0]
while (++index < len) {
reslut = fns[index].call(this, reslut)
}
return reslut
}
}

compose 函数实现的更多相关文章

  1. compose函数

    compose函数 在学习redux源码的时候看到了其中的工具函数compose,compose函数的作用就是组合函数,依次组合传入的函数: 后一个函数作为前一个函数的参数 最后一个函数可以接受多个参 ...

  2. JS高阶编程技巧--compose函数

    先看代码: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 ...

  3. C#函数式编程之由函数构建函数

    在面向对象的编程中,如果我们需要复用其他的类,我们可以通过继承来实现.而在函数式编程中我们也可以采取不同的方式来复用这些函数.今天的教程将会讲述两种方式,其中一个就是组合,将多个函数组合成为一个函数, ...

  4. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  5. 函数式编程-compose与pipe

    函数式编程中有一种模式是通过组合多个函数的功能来实现一个组合函数.一般支持函数式编程的工具库都实现了这种模式,这种模式一般被称作compose与pipe.以函数式著称的Ramda工具库为例. cons ...

  6. javascript基础修炼(8)——指向FP世界的箭头函数

    一. 箭头函数 箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于"ES6里添加了哪些新特性?"这种问题的时候,几乎总是会拿箭头函数来应 ...

  7. javascript柯里化及组合函数~

    大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...

  8. js函数式编程(三)-compose和pointFree

    compose即函数嵌套组合 组合compose在第一篇已经初见端倪,可以感受一下.compose函数的实现用闭包的方法.不完善实现如下: const compose = (f, g) => { ...

  9. 高阶函数&&高阶组件(二)

    高阶组件总共分为两大类 代理方式 操纵prop 访问ref(不推荐) 抽取状态 包装组件 继承方式 操纵生命周期 操纵prop 代理方式之 操纵prop 删除prop import React fro ...

随机推荐

  1. java-冒泡

    一.java冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  2. 标准代码书写 C++ 的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果 离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是 ...

  3. 在C语言中使用libb64进行Base64编解码

    libb64下载地址http://sourceforge.net/projects/libb64 以下为Demo libb64_demo.c #include <stdio.h> #inc ...

  4. TFS Server 2017 自动化部署步骤

    1 第一步,在服务器上安装TFS 2 第二步,安装完TFS后需要配置你的项目,选择管理代码的方式,这里我们可以选择传统的TFS 也可以选择GIT 方式,此处我选择的GIT 方式 3 第三步,设置代理. ...

  5. extjs4.0 treepanel节点的选中、展开! 数据的重新加载

    1.extjs4.0API较3.0有非常大变化2.多级子父节点的选中和展开.3.数据的重新加载.tree.getStore().load4.节点的移除,从树中根据ID获取节点 tree.getStor ...

  6. mysql---列的选取原则

    列选择原则: :字段类型优先级 整型 > date,整型>浮点型,time > enum,char>varchar > blob 列的特点分析: 整型: 定长,没有国家/ ...

  7. linux 解决 Device eth0 does not seem to be present

    在虚拟机中安装cent os系统,然后配置网络 执行命令ifconfig 没有看到eth0的信息: 重启网卡报错: service network restart Shutting down loop ...

  8. Hadoop 中的 (side data) 边数据

    一.用途 边数据是作业所需的额外的只读数据,通常用来辅助主数据集: 二.方法 1.利用Configuration类来配置,利用setter()和getter()可方便的使用,方便存储一些基本的类型: ...

  9. Scanner、String(java基础知识十二)

    1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...

  10. Android 走向MD的配色风格

    这是一些google官方推出的推荐色值 下面补充上对应的xml文件,省得大家再去自己写 <?xml version="1.0" encoding="utf-8&qu ...