老生常谈,函数柯里化(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高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
随机推荐
- 从零自学Java-9.描述对象
1.为类或对象创建变量:2.使用对象和类的方法:3.调用方法并返回一个值:4.创建构造函数:5.给方法传递参数:6.使用this来引用对象:7.创建新对象. 程序VirusLab:测试Virus类的功 ...
- 天池新人赛-天池新人实战赛o2o优惠券使用预测(一)
第一次参加天池新人赛,主要目的还是想考察下自己对机器学习上的成果,以及系统化的实现一下所学的东西.看看自己的掌握度如何,能否顺利的完成一个分析工作.为之后的学习奠定基础. 这次成绩并不好,只是把整个机 ...
- 洗礼灵魂,修炼python(36)--面向对象编程(6)—类的相关内置函数issubclass,hasattr等
啥?我靠,类也有内置函数?哈哈,确实有的.有哪些呢?请往下看 issubclass(cls, class_or_tuple, /) 1.基本属性: 方法全是特殊方法 2.使用方法:判断一个类是否由另一 ...
- Python读取PE文件(exe/dll)中的时间戳
代码原文地址: https://www.snip2code.com/Snippet/144008/Read-the-PE-Timestamp-from-a-Windows-Exe https://gi ...
- banner图片全屏显示
<script> $(function () { function reinitSize() { var window_h = $(window).height(); var window ...
- PJ可能会用到的动态规划选讲-学习笔记
PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...
- 二: python基础数据类型(int,
一.什么是数据类型?2018-12-20 20:57:3õ # (3) num = 0 while num < 10: num += 1 if num == 7: num += 1 # 7执 ...
- 手机上的m3u8视频(缓存)怎么转成MP4?
一.下载M3u8合并APK,自定义扫描手机中的m3u8文件目录.选择导出的目录,可以多个同时进行m3u8的合并任务. 合并后的文件可以完整播放,但是视频时间只有前十来秒,进度无法拖动. 二.将合并好的 ...
- Appium1.9 之 Chromedriver安装方式
1.在 appium 官网上下载安装后,下载的是1.7.1的版本,安装之后是1.9.1最新版本. 2.appium安装之后,会发现涉及到 浏览器相关的业务时(我使用的是chrome)会提示 “No C ...
- css设置标签居中
position: absolute; //相对于已经定位的父元素的位置. left: 50%; top: 50%; transform: translate(-50%,50%);