转自  http://simplyy.space/article/577c5b0dcbe0a3e656c87c24

多个连续的箭头函数与柯里化

高阶函数

高阶函数定义:将函数作为参数或者返回值是函数的函数。

所以高阶函数分两种:

  1. 是我们常见的 sort,reduce 等函数。
  2. 返回值是函数的函数。

一般而言,我们要理解常见的高阶函数还是很容易的。比如:

function add(a) {
return function(b) {
return a + b
}
} var add3 = add(3)
add3(4) === 3 + 4 //true

add 函数 在 es6 里的写法等价为

let add = a => b => a + b

其实以上就是 柯里化函数 只不过用 es6 写,变了一个样子,后面详细介绍它的原理和特点。

多个连续的箭头函数

but 当一堆箭头函数在你面前的时候,你会不会有一丝犹豫,我在此之前就是一脸懵逼。。。比如我看到下面的 redux-thunk 的源码(没错整个源码只有14行)里的多个连续箭头函数的时候。。。

// 形如
a => b => c => {xxx}

那怎么轻松理解这些箭头干了啥呢,当我看了柯里化后,瞬间就懂了,

多个连续箭头函数就是 es6的多次柯里化的写法

柯里化

我们先看 stackoverflow 的关于如何理解多个箭头函数的最高票回答,

他说 这就是柯里化函数。(This is a curried function)

wiki 的柯里化定义: 把接受多个参数的函数变换成接受一个单一参数的函数,并且返回(接受余下的参数而且返回结果的)新函数的技术

好,现在懂没,我来简单说一下。

关键就是理解柯里化,其实可以把它理解成,柯里化后,将第一个参数变量存在函数里面了(闭包),然后本来需要n个参数的函数可以变成只需要剩下的(n - 1个)参数就可以调用,比如

let add = x => y => x + y
let add2 = add(2)

本来完成 add 这个操作,应该是

let add = (x, y) => x + y

它需要俩参数,而现在 add2 函数完成同样操作只需要一个参数,这在函数式编程中广泛应用。

详细解释一下,就是 add2 函数 等价于 有了 x 这个闭包变量的 y => x + y 函数

并且此时 x = 2,所以此时调用

add2(3) === 2 + 3

回归正题

let add = x => y => x + y

add 函数按照 wiki 的定义可以理解成只柯里化了一次,那么下面这种呢?

a => b => c => {xxx}

n 个连续箭头组成的函数实际上就是柯里化了 n - 1次。

具体调用过程如下:

前 n - 1 次调用,其实是提前将参数传递进去,并没有调用最内层函数体,最后一次调用才会调用最内层函数体,并返回最内层函数体的返回值。

结合上文可知,这里的多个连续箭头(无论俩个箭头函数三个及以上)函数连在一起 就是在柯里化。

所以连续箭头函数就是多次柯里化函数的 es6 写法。

let test = a => b => c => {xxx}

调用特点

let test = a => b => c => {xxx}

比如对于上面的 test 函数,它有 3 个箭头, 这个函数要被调用 3 次 test(a)(b)(c),前两次调用只是在传递参数,只有最后依次调用才会返回 {xxx} 代码段的返回值,并且在 {xxx} 代码段中可以调用 a,b,c

柯里化函数的功能

  1. 可以惰性求值
  2. 可以提前传递部分参数

关于 ES6箭头函数的更多相关文章

  1. es6箭头函数讲解

    es6箭头函数的用法 箭头函数是es6的一种函数的简写方法. 如下: var f = v = > v; //等同于 var f = function(v){ return v; } var su ...

  2. es6箭头函数 this 指向问题

    es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){ ...

  3. ES6 — 箭头函数

    一 为什么要有箭头函数 我们在日常开发中,可能会需要写类似下面的代码 const Person = { 'name': 'little bear', 'age': 18, 'sayHello': fu ...

  4. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  5. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  6. ES6 箭头函数(Arrow Functions)

    ES6 箭头函数(Arrow Functions) ES6 可以使用 "箭头"(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 具有一个参数的简单函 ...

  7. ES6箭头函数基本用法

    ES6箭头函数基本用法 ``` window.onload = function(){ alert(abc); } //箭头函数 window.onload = ()=>{ alert(&quo ...

  8. ES6 箭头函数this指向问题

    var name = "window"; var person1 = { name: "person1", show1: function() { consol ...

  9. Vue ES6箭头函数使用总结

    Vue ES6箭头函数使用总结   by:授客 QQ:1033553122   箭头函数 ES6允许使用“箭头”(=>)定义函数: 函数不带参数 定义方法:函数名称 = () => 函数体 ...

  10. ES6 -箭头函数 ,对象的函数解构

    ES6 -箭头函数: //es6 中的箭头函数和扩展 //es5的写法 // function add(a,b){ // return a + b; // } // add(1,2); //3 fun ...

随机推荐

  1. HDU5806:NanoApe Loves Sequence Ⅱ(尺取法)

    题目链接:HDU5806 题意:找出有多少个区间中第k大数不小于m. 分析:用尺取法可以搞定,CF以前有一道类似的题目. #include<cstdio> using namespace ...

  2. libvirt虚拟系统如何增加usb设备

    之前干这些事情都是通过virt-manager来搞定的.不过由于这个图形界面不太方便,而且现在没法打开(具体原因不详,每次打开提示一些方法未实现什么的),所以试下用libvirt的命令virsh来搞定 ...

  3. Argument 'xxx' is not a function, got undefined,初学Angular的第一个坑

    终于考完试了,在没更新的这一段时间里,一直都在忙于应付考试.不过在期间也是接触到不少好玩的东西,比如Html5的Canvas,我用lufylegend的Html5引擎做了个<看你有所色>的 ...

  4. 浏览器插件-ActiveX

    浏览器插件:B/S模式下通过在客户端浏览器安装插件调用外设或者处理特殊格式数据. 常用插件有身份证阅读器.sim卡阅读器.银行卡校验插件.手写板插件.小键盘插件: 处理表格数据的华表插件.图片合成插件 ...

  5. Java 8 正式发布,新特性全搜罗

    经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...

  6. WEB安全之威胁解析

    本文章转载自 http://www.xuebuyuan.com/60198.html 主要威胁: 暴力攻击(brute-force attack):这些攻击通过尝试所有可能的字符组合,以发现用户证书. ...

  7. Contest 7.23(不知道算什么)

    Problem A   URAL 1181 Cutting a Painted Polygon 题目大意就是说有一个N边形,让你做N-3条边,让他们的每个三角形的三个顶点颜色都不相同. 这里有一个引理 ...

  8. UVaLive 7360 Run Step (排列组合,枚举)

    题意:给定一个数 n ,表示一共有 n 步,然后你可以迈一步也可以迈两步,但是左腿和右腿的一步和两步数要一样,并且两步数不小于一步数,问你有多少种方式. 析:虽然是排列组合,但还是不会做.....水啊 ...

  9. hdu 4578 Transformation(线段树)

    线段树上的多操作... 题目大意: 树上 的初始值为0,然后有下列三种操作和求和. 1  x y c  在X-Y的之间全部加上C. 2  x y c  在X-Y的之间全部乘上C. 3  x y c   ...

  10. 基于OpenCV的iOS开发笔记(1)

    本系列文章采用的的开发环境为: 1)Xcode 6 2)OpenCV for iOS 3.0.0 -------------------分割线---------------------------- ...