概念
将一个函数拆分成多个函数
示例
1 | // 判断类型 Object.prototype.toString.call |
示例拓展:
1 | let b = checkType(123, 'Number'); |
所以现在想要 类似于 isString(‘12345’)这样实现,因为如果方法名写错会报错,而‘Number’这个字符串写错 结果就是false了
1 | const checkType = (type) =>{ |
如上line1-5将一个函数(checkType )拆分成了2个更细小的部分
当执行line6时 传过去的‘String’ 保存到了line2-4这个函数的作用域中
1 | (content) => { |
它返回的函数 可以在其他作用域(即line7) 中执行 即为闭包
,函数checkType返回的值可以在其他作用域中执行
面试题
函数柯里化怎么实现
1 | add(1,2)(3)(4)(5); // 15 |
这里可以构建add函数如下:
1 | const add = (a, b, c, d, e) => { |
分析:当调用的参数个数为5 == 该函数本身参数个数的时候才执行了return 所以app(1,2)时返回一个函数,app(3)时返回一个函数…
每次调用的时候存值[1,2,3,4,5]当这个数组中的个数和这个方法中的参数个数相等时执行。
完整代码如下:
1 | const add = (a, b, c, d, e) => { |
以上为通用柯里化,好处是可以把函数更细化。
利用闭包将函数的参数储存起来,等参数达到一定数量时执行函数。
示例拓展优化
1 | // 用checkType实现 |
柯里化的作用
参数复用
1 | function volume(length, width, height) { |
如上计算长方体的体积函数会发现存在很多相同长度的长方体,我们再用柯里化函数实现一下:
1 | function volume(length, width, height) { |
如上,通过实现一个len200函数我们统一处理长度为200的长方体的体积,这就实现了参数复用
。
[场景] https://segmentfault.com/a/1190000010878974
Curry 的核心思想是把多参数传入的函数拆成单参数(或部分)函数,内部再返回调用下一个单参数(或部分)函数,依次处理剩余的参数。