Skip to content

Latest commit

 

History

History
48 lines (40 loc) · 1.03 KB

柯里化.md

File metadata and controls

48 lines (40 loc) · 1.03 KB

柯里化

柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术

function add(a, b) {
  return a + b;
}

// 执行 add 函数,一次传入两个参数即可
add(1, 2) // 3

// 假设有一个 curry 函数可以做到柯里化
var addCurry = curry(add);
addCurry(1)(2) // 3

优化

// 第一版
function curry(fn, args) {
  var length = fn.length;
  args = args || [];
  return function() {
    var _args = args.slice(0)

    for (var i = 0; i < arguments.length; i++) {
      _args.push(arguments[i]);
    }
    if (_args.length < length) {
      return curry.call(this, fn, _args);
    } else {
      return fn.apply(this, _args);
    }
  }
}

var fn = curry(function(a, b, c) {
  console.log([a, b, c]);
});

fn("a", "b", "c") // ["a", "b", "c"]
fn("a", "b")("c") // ["a", "b", "c"]
fn("a")("b")("c") // ["a", "b", "c"]
fn("a")("b", "c") // ["a", "b", "c"]

参考

JavaScript专题之函数柯里化