【前端--面试】常见面试题(七)—— 详解JS函数柯里化

285 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

JS函数柯里化

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel戈特洛布·弗雷格发明的。 看着这个词,就很高大上的感觉,解释看着好像似懂非懂的样子,不过看看例子就明白了。

常见面试题:实现add(1)(2)(3)(4)=10;

在日常我们经常见到求和的其实是这样的:add(1,2,3) = 6;

function add(x, y, z) {
  return x + y + z;
}
console.log(add(1, 2, 3)); // 6

还有另一种写法:

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);

这里我们定义了一个add函数,它接受一个参数并返回一个新的函数。调用add之后,返回的函数就通过闭包的方式记住了add的第一个参数。

怎么说呢,看着是实现功能了,就是有点傻傻的,哈哈哈哈~~

当然我们知道ES6可以再改改上面的代码:

const add = x => y => z => x + y + z;

那么我们用柯里化这个概念来实现一个自动的柯里化函数

首先我们在第一次执行时候,先定义一个数组专门用来存储所有的参数const _args = [...arguments];

然后在内部声明一个函数,利用闭包的特性保存在_args中并收集所有的参数值。

再接着利用toString隐式转换的特性,当最后执行隐式转换的时候,计算最终的值并返回。

function add() {
  const _args = [...arguments];
  function fn() {
    _args.push(...arguments);
    return fn;
  }
  fn.toString = function() {
    return _args.reduce((sum, cur) => sum + cur);
  }
  return fn;
}

在面试中,因为没有实际的项目应用,一般会出一个类似于这样的题目,来考一下我们对函数柯里化的认识;

当然我们平时也会应用的到,传统的函数调用需要预先确定所有实参,如果在代码一个地方只获取到一部分实参,在另一个地方获取到另一部分实参,这时候柯里化就能用上了。