美文网首页
函数柯里化

函数柯里化

作者: 你喜欢吃青椒吗_c744 | 来源:发表于2019-08-10 23:13 被阅读0次

定义

把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

上面的话怎么理解:

把接受多个参数的函数变换成接受一个单一参数 >> 比如一个函数里要传进来三个参数,但是我把它设置为只能传进来一个参数。

返回接受余下的参数而且返回结果的新函数 >>只能传进来一个参数,那其他两个参数怎么办?没事。最外层的函数可以再return一个函数,这个函数在传入一个参数,那剩下的一个参数怎么办?中间的这个函数再return一个函数,最后的函数再传入最后一个参数。

例子

一个求三个数之和的函数:

//正常写法
function add(x, y, z) {
  return x + y + z;
}
console.log(add(1, 2, 3)); // 6
//ES5
var add = function(x) {
  return function(y) {
    return function(z) {
      return x + y + z;
    }
  }
}

var addOne = add(1);
var addOneAndTwo = addOne(2);
var addOneAndTwoAndThree = addOneAndTwo(3);

console.log(addOneAndTwoAndThree);
//ES6
const add = x => y => z => x + y + z;

面试题

如何实现 multi(2)(3)(4)=24?
//简单的方法
function multi(a) {
    return function(b) {
        return function(c) {
            return a * b * c;
        }
    }
}
//ES6的写法
const multi = x => y => z => x * y * z
// 柯里化最终优化版
function multi() {
    var args = Array.prototype.slice.call(arguments);
    var fn = function() {
        var newArgs = args.concat(Array.prototype.slice.call(arguments));
        return multi.apply(this, newArgs);
    }
    fn.toString = function() {
        return args.reduce(function(a, b) {
            return a * b;
        })
    }
    return fn;
}

curry 函数的第一个参数是要动态创建柯里化的函数,余下的参数存储在 args 变量中。

执行 curry 函数返回的函数接收新的参数与 args 变量存储的参数合并,并把合并的参数传入给柯里化了的函数。

作用

  • 减少代码冗余,以及增加代码的可读性
  • 参数复用
  • 延迟执行
    柯里化的另一个应用场景是延迟执行。不断的柯里化,累积传入的参数,最后执行。
  • 提前返回

相关文章

网友评论

      本文标题:函数柯里化

      本文链接:https://www.haomeiwen.com/subject/nyedjctx.html