高阶函数returns 纯函数

Higher order function returns pure function

这是一个名为 functionA 的高阶函数示例,它以自定义值作为输入,returns 一个函数获取输入并使用自定义值来详细说明结果:

let functionA = (customValue) => {
  let value = customValue || 1;
  return input => input * value;
};

这是一些结果:

functionA()(4)             
// => returns 4

functionA(2)(4)
// => returns 8

functionA(3)(4)
// => returns 12

functionA(4)(4)
// => returns 16

functionA返回的函数可以算纯函数吗?

UPDATE: 上面的例子只使用数字输入。正如@CRice 所述,仅当 customValue 为常量且没有内部状态(如 类)时,返回的函数才可被视为纯函数。

是的,returned 的函数可以被认为是纯函数。它被认为是纯函数的原因是,在给定完全相同的输入的情况下,函数总是 return 相同的输出。

使用this definition of Pure Function:

In computer programming, a pure function is a function that has the following properties:

  1. Its return value is the same for the same arguments (no variation with local static variables, non-local variables, mutable reference arguments or input streams from I/O devices).

  2. Its evaluation has no side effects (no mutation of local static variables, non-local variables, mutable reference arguments or I/O streams).

那么,没有functionA不会总是return一个纯函数。

这里有一种使用 functionA 的方法,这样它就不会 return 一个纯函数:

let functionA = (customValue) => {
  let value = customValue || 1;
  return input => input * value;
};

class Mutater {
  constructor() {
    this.i = 0;
  }
  valueOf() {
    return this.i++;
  }
}

const nonPureFunction = functionA(new Mutater());

// Produces different results for same input, eg: not pure.
console.log(nonPureFunction(10));
console.log(nonPureFunction(10));

如您所见,returned 函数在给定相同输入 (10) 时会产生不同的结果。这违反了上述定义中的第一个条件(并且使用相同的技巧您也可能违反第二个条件)。

你的返回函数可以被认为是纯函数。在您的示例中,您实际上有 4 个不同的纯函数。

const pureFunc1 = functionA();
pureFunc1(4)   // => returns 4
pureFunc1(4)   // => returns 4

const pureFunc2 = functionA(2);
pureFunc2(4)   // => returns 8
pureFunc2(4)   // => returns 8

// ...