根据定义,如果满足以下条件,纯函数就是纯函数:
- 给定相同的输入,将始终返回相同的输出。
- 没有副作用。
- 不依赖于外部状态。
所以这是一个纯函数:
function foo(x) {
return x * 2;
}
foo(1) // 2
foo(2) // 4
foo(3) // 6
这也是一个纯函数(在 JavaScript 上下文中)
Math.floor(x);
Math.floor(1.1); // 1
Math.floor(1.2); // 1
Math.floor(2.2); // 2
问题:如果我们将这 2 个纯函数结合起来,它是否仍被视为纯函数?
// Nested with Math library
function bar(x) {
return Math.floor(x);
}
// Nested even deeper
function foobar(x) {
return foo(Math.floor(x));
}
显然,在没有副作用的情况下,它仍然总是在给定相同输入的情况下返回相同的输出,但是从其他上下文(作用域)调用函数是否违反了“不依赖外部状态”的法律?
最佳答案
外部状态不同于外部代码。如果纯函数不能使用外部代码,那么几乎就没有纯函数这样的东西了。即使您所有的函数都是 x * 2
,在(许多)纯函数式语言中,甚至 *
也是一个函数。所以即使是这个简单的函数也无法避免调用其他函数。
函数定义或多或少只是语法细节。您可以将外部函数的函数体内联到更长的表达式中。例如:
function foo(a, b) {
return bar(a) + bar(b);
}
function bar(x) {
return x * 2;
}
等同于:
function foo(a, b) {
return a * 2 + b * 2;
}
唯一的区别是代码片段的可重用性和/或可读性和可维护性。不是纯度。
如果函数不引起副作用或不受其自身之外的副作用/状态的影响,则该函数是纯函数。只要它调用的所有代码也符合该规则,它就会保持纯净。
关于javascript - 嵌套的纯函数还是纯函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280977/