老生常谈,函数柯里化(curring)
柯里化这个概念确实晦涩难懂,没有深入思考过的人其实真的很难明白这是一个什么东西。看起来简单、简单到或许只需要一行代码:
const curry = fn => (…args) => fn.bind(null, …args);
是的,就是这么简单。
如果单纯的去理解这一句代码,实在太痛苦了,不妨拆开来,一点一点的去看,也不妨再笨点,先尝试着写成传统的ES5,我们用arguments 去代替 ...args 慢慢理解。貌似是下面这样
const curry = function(fn){
return function (){ //
return fn.bind(null, arguments) //
}
}
可是看着感觉有点不对劲呢?
显然2处的arguments已经和上面的args已经不是一个东西了,这里的arguments是1处函数调用时的参数,所以要改进下
const curry = function(fn){
let args = [].slice.call(arguments, 1) // 这句话的意思是差不多等于 let args = arguments.slice(1) ,但是argumets不是数组(伪数组),所以不能这么写
return function (){ // 1
let _args = args.concat([].slice.call(arguments)) // 拼接出新的arguments
return fn.bind(null,_args) //
}
}
这下好像和我们之前看的差不多了嘛,但是这他妈拆了半天函数啥也没说,不是等于放屁吗?
好吧,如果直接去看概念搞不懂的话,换个思路,看代码,如果看懂了,再去想概念不就更加容易理解了吗?
接着再看
fn.bind(null, _args)
这句话是干啥子的,
bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数, 它的参数是 bind() 的其他参数和其原本的参数。
懂了吗?
function a(){
return [].slice.call( arguments)
}
a(1,2,3) // [1,2,3] var _a = a.bind(null, 4,5)
_a(1,2,3) // [4,5,1,2,3]
其实只是拼接了参数而已,而且bind返回的是一个函数,等着被调用,
这样看来每次调用curry函数都只是把之前的参数和这次的参数收集到一个数组里,然后返回一个新的函数,而且这个函数已经默认带了之前传入的所有参数。是的,柯里化就是一个参数收集器,返回新的函数而已。
这玩意有啥用?
很多文章都已经说明了,大家可以去参考一下别的文章就可以了。
希望能对大家理解柯里化有些帮助。
参考链接:
http://www.webhek.com/post/javascript-bind.html
https://www.zhangxinxu.com/wordpress/2013/02/js-currying/
老生常谈,函数柯里化(curring)的更多相关文章
- 深入理解javascript函数进阶系列第二篇——函数柯里化
前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...
- JavaScript函数柯里化的一些思考
1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- [转]js函数式变成之函数柯里化
本文转自:https://segmentfault.com/a/1190000003733107 函数柯里化是指参数逐渐求值的过程. 我觉得它是:降低通用性,提高专用性. 通常,柯里化是这样的过程,“ ...
- 函数柯里化(Currying)示例
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- 一道javascript面试题(闭包与函数柯里化)
要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
随机推荐
- (网页)备注在HTML页面的放置的小技巧(title属性)
其实很简单,就是title这个属性:(字符多余的剪切,title显示完整的字符) 下面是代码: <ul> <li title="江南style.江南style.江南styl ...
- [20170705]理解linux su命令.txt
[20170705]理解linux su命令.txt --//我一般在维护时经常使用root用户登录,然后su - oracle 转到其他用户操作--//一般都加入 - 参数.这个已经成了条件反射.. ...
- python 3.3.2报错:No module named 'urllib2'
ModuleNotFoundError: No module named 'urllib3' 1. ImportError: No module named 'cookielib'1 Python3中 ...
- python第七十一天---堡垒机
堡垒机的表结构图:
- python基础知识回顾之字符串
字符串是python中使用频率很高的一种数据类型,内置方法也是超级多,对于常用的方法,还是要注意掌握的. #author: Administrator #date: 2018/10/20 # pyth ...
- 高通GPIO驱动(DTS方式)
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...
- shell中>/dev/null 2>&1
本文转自http://www.kissyu.org/ 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬 ...
- zabbix使用自定义脚本监控内存
我这里的脚本是监控centos7系统的内存.centos7系统的内存如何查看我之前的博客都是有的.这里直接写了监控步骤 1.首先是编写脚本. #!/bin/bash mem_total(){ TOTA ...
- 习题 6 字符串(string)和文本
虽然你已经在程序中写过字符串了,你还没学过它们的用处.在这章习题中我们将使用复杂的字符串来建立一系列的变量,从中你将学到它们的用途.首先我们解释一下字符串是什么 东西. 字符串通常是指你想要展示给别人 ...
- android-UI组件(四):AdapterView及其子类
http://blog.csdn.net/litianpenghaha/article/details/23270881 AdapterView组件是一组重要的组件,AdapterView本身是一个抽 ...