嵌套的纯函数仍然是纯函数吗?

kav*_*are 6 javascript functional-programming immutability

根据定义,如果符合以下条件,Pure Function是纯粹的

  • 给定相同的输入,将始终返回相同的输出.
  • 不产生副作用.
  • 没有外部状态.

所以这是一个纯函数:

function foo(x) {
  return x * 2;
}

foo(1) // 2
foo(2) // 4
foo(3) // 6
Run Code Online (Sandbox Code Playgroud)

这也是一个纯函数(在JavaScript上下文中)

Math.floor(x);

Math.floor(1.1); // 1
Math.floor(1.2); // 1
Math.floor(2.2); // 2
Run Code Online (Sandbox Code Playgroud)

问题是:如果我们将这两个纯函数结合起来,它还会被认为是一个纯函数吗?

// Nested with Math library
function bar(x) {
  return Math.floor(x);
}

// Nested even deeper
function foobar(x) {
  return foo(Math.floor(x));
}
Run Code Online (Sandbox Code Playgroud)

显然,在没有副作用的情况下,它仍然总是返回相同的输出,但是从其他上下文(范围)调用函数会违反" 依赖于无外部状态 " 的规律吗?

dec*_*eze 10

外部状态外部代码不同.如果纯函数不能使用外部代码,那么根本就没有纯粹的函数.即使你的所有功能都是x * 2,在(很多)纯函数式语言中* 也是一个函数.所以即使是这个简单的函数也无法避免调用其他函数.

函数定义或多或少只是语法细节.您可以将外部函数的函数体内联到更长的表达式中.例如:

function foo(a, b) {
    return bar(a) + bar(b);
}

function bar(x) {
    return x * 2;
}
Run Code Online (Sandbox Code Playgroud)

与以下内容相同:

function foo(a, b) {
    return a * 2 + b * 2;
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是代码片段的可重用性和/或可读性和可维护性.不纯洁.

如果一个函数不会引起副作用或受到自身外部副作用/状态的影响,那么它就是纯粹的.只要它调用的所有代码也符合该规则,它就保持纯粹.