柯里化这个概念确实晦涩难懂,没有深刻思考过的人其实真的很难明白这是一个什么东西。看起来简单、简单到或许只须要一行代码:javascript
const curry = fn => (…args) => fn.bind(null, …args);
是的,就是这么简单。html
若是单纯的去理解这一句代码,实在太痛苦了,不妨拆开来,一点一点的去看,也不妨再笨点,先尝试着写成传统的ES5,咱们用arguments 去代替 ...args 慢慢理解。貌似是下面这样java
const curry = function(fn){ return function (){ // 1 return fn.bind(null, arguments) //2 } }
但是看着感受有点不对劲呢?web
显然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) //2
} }
这下好像和咱们以前看的差很少了嘛,可是这他妈拆了半天函数啥也没说,不是等于放屁吗?
wordpress
好吧,若是直接去看概念搞不懂的话,换个思路,看代码,若是看懂了,再去想概念不就更加容易理解了吗?函数
接着再看 post
fn.bind(null, _args)this
这句话是干啥子的,spa
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函数都只是把以前的参数和此次的参数收集到一个数组里,而后返回一个新的函数,并且这个函数已经默认带了以前传入的全部参数。是的,柯里化就是一个参数收集器,返回新的函数而已。
这玩意有啥用?
不少文章都已经说明了,你们能够去参考一下别的文章就能够了。
但愿能对你们理解柯里化有些帮助。
参考连接: