21

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

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 返回的函数可以认为是纯函数吗?

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

4

3 回答 3

23

使用纯函数的这个定义

在计算机编程中,纯函数是具有以下属性的函数:

  1. 对于相同的参数,它的返回值是相同的(本地静态变量、非本地变量、可变引用参数或来自 I/O 设备的输入流没有变化)。

  2. 它的评估没有副作用(没有局部静态变量、非局部变量、可变引用参数或 I/O 流的突变)。

那么,functionA不会总是返回一个纯函数。

这是一种functionA不返回纯函数的使用方法:

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

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

于 2018-08-22T02:33:29.297 回答
3

是的,返回的函数可以被认为是纯函数。它被认为是纯粹的原因是因为在给定完全相同的输入的情况下,该函数将始终返回相同的输出。

于 2018-08-22T02:30:35.767 回答
0

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

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

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

// ...
于 2018-08-22T02:38:00.470 回答