偏函数定义

wiki

在计算机科学中,局部应用是指固定一个函数的一些参数,然后产生另一个更小元的函数。 什么是元?元是指函数参数的个数,比如一个带有两个参数的函数被称为二元函数。

例子

  1. function add(a, b) {
  2. return a + b;
  3. }
  4. // 执行 add 函数,需要传入两参数。
  5. add(1, 2); // 3
  6. // 假设有一个 partial 函数可以做到局部应用
  7. const addOne = partial(add, 1);
  8. addOne(2); // 3

柯里化与局部应用的区别

  1. 柯里化是将一个多参数函数转换成多个单参数函数,也就是将一个 n 元函数转换成 n 个一元函数。
  2. 局部应用则是固定一个函数的一个或者多个参数,也就是将一个 n 元函数转换成一个 n - x 元函数。

实现 partial 函数

第一版

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

第二版(支持占位符)

  1. const _ = {};
  2. function partial(fn) {
  3. const args = [].slice.call(arguments, 1);
  4. return function () {
  5. let position = 0, len = args.length;
  6. for (let i = 0; i < len; i++) {
  7. args[i] = args[i] === _ ? arguments[position++] : args[i];
  8. }
  9. while (position < arguments.length) args.push(arguments[position++]);
  10. return fn.apply(this, args);
  11. };
  12. };

参考:

[1] javascript 专题之偏函数
[2] Partial application