总结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. Remove FileUtil#copyMerge

    [HADOOP-12967] Remove FileUtil#copyMerge - ASF JIRA https://issues.apache.org/jira/browse/HADOOP-129 ...

  2. kill 挂起 Apache Web Server

    [root@hadoop1 ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8 ...

  3. java中创建对象的五种方法

    用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. newIn ...

  4. 关于JAVA中的前期绑定 后期绑定(动态绑定)

    前期绑定,在程序执行前根据编译时类型绑定,调用开销较小,如C语言只有前期绑定这种方法调用. 后期绑定,是指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定.实现后期绑定,需要某种机制支持,以便 ...

  5. 【bzoj3282】Tree

    LCT模板题: 话说xor和的意思是所有数xor一下: #include<iostream> #include<cstdio> #include<cstring> ...

  6. Scrapy运行报错:ModuleNotFoundError: No module named 'douban.douban'

    运行scrapy爬虫报错: from douban.douban.items import DoubanItem ModuleNotFoundError: No module named 'douba ...

  7. codeforces B. Balls Game 解题报告

    题目链接:http://codeforces.com/problemset/problem/430/B 题目意思:给出用不多于k种颜色对n个球的染色情况,以及手中的唯一一个球的颜色.初始时,连续的相同 ...

  8. html5--6-51 阶段练习3-旋转导航

    html5--6-51 阶段练习3-旋转导航 @charset="UTF-8"; ul{ list-style: none; font-size:24px; font-weight ...

  9. 两种 NIO 实现:Selector 与 Epoll

    [总结]两种 NIO 实现:Selector 与 Epoll 时间2012-11-17 08:38:42 开源中国新闻原文  http://my.oschina.net/ielts0909/blog/ ...

  10. Android Studio四大组件之Service

    Service在Android运行在后台,它没有可视化界面,只是默默运行在后台.我们以一个后台定时器的例子清晰的说明Service的运行流程. 一.创建Service类 项目右键->New-&g ...