1.柯里化

在数学和计算机科学中,柯里化是一种将使用多个参数的函数转化为使用一系列一个参数的函数的技术。利用闭包保护私有变量的机制,将一部分参数预先处理作为私有变量保存起来。其中一个主要用途为:参数复用,本质上是降低通用性,提高适用性。

1.根据函数参数控制递归次数

  1. function curry() {
  2. if(arguments.length === 0) {
  3. throw Error('arguments error')
  4. }
  5. let fn = arguments[0]
  6. if(typeof fn !== 'function'){
  7. throw Error('not a function')
  8. }
  9. let args = [].slice.call(arguments,1)
  10. let arglength = fn.length
  11. return function() {
  12. let arg = [...arguments,...args]
  13. if(arg.length >= arglength) {
  14. return fn.apply(this,arg)
  15. } else {
  16. return curry.call(this,fn,...arg)
  17. }
  18. }
  19. }

2.根据参数和函数参数个数控制递归次数

  1. function curry(fn,length) {
  2. length = fn.length || length;
  3. return function(...args) {
  4. if(args.length >= length) {
  5. return fn.call(this,...args)
  6. }else {
  7. return curry(fn.bind(null,...args),length - args.length)
  8. }
  9. }
  10. }

2.偏函数

在计算机科学中,局部应用是指固定一个函数的一些参数,然后产生另一个更小元的函数。柯里化是将一个多参数函数转换成多个单参数函数,也就是将一个 n 元函数转换成 n 个一元函数。局部应用则是固定一个函数的一个或者多个参数,也就是将一个 n 元函数转换成一个 n - x 元函数。

  1. function partial() {
  2. let fn = arguments[0]
  3. let args = [].slice.call(arguments,1)
  4. return function() {
  5. return fn.apply(this,[...arguments,...args])
  6. }
  7. }