柯里化 - 2023-02-11

2023-02-10  本文已影响0人  勇敢的小拽马

维基百科中对柯里化 (Currying) 的定义为:

In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments (or a tuple of arguments) into evaluating a sequence of functions, each with a single argument.

翻译成中文:

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

用途

比如我们有这样一段数据:

var person = [{name: 'kevin'}, {name: 'daisy'}]

如果我们要获取所有的 name 值,我们可以这样做:

var name = person.map(function (item) {
    return item.name;
})

不过如果我们有 curry 函数:

var prop = curry(function (key, obj) {
    return obj[key]
});

var name = person.map(prop('name'))

我们为了获取 name 属性还要再编写一个 prop 函数,是不是又麻烦了些?

但是要注意,prop 函数编写一次后,以后可以多次使用,实际上代码从原本的三行精简成了一行,而且你看代码是不是更加易懂了?

person.map(prop('name'))就好像直白的告诉你:person 对象遍历(map)获取(prop) name 属性。

实现

function curry(fn, args) {
   var length = fn.length;

   args = args || [];

   return function() {

       var _args = args.slice(0),

           arg, i;

       for (i = 0; i < arguments.length; i++) {

           arg = arguments[i];

           _args.push(arg);

       }
       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"]
上一篇 下一篇

猜你喜欢

热点阅读