根据定义,一个纯函数是纯的,如果:
- 给定相同的输入,将始终返回相同的输出。
- 不产生任何副作用。
- 不依赖于外部状态。
所以这是一个纯函数:
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
问题:如果我们将这两个纯函数结合起来,它仍然被视为纯函数吗?
// Nested with Math library
function bar(x) {
return Math.floor(x);
}
// Nested even deeper
function foobar(x) {
return foo(Math.floor(x));
}
显然,给定相同的输入,它仍然总是返回相同的输出,没有副作用,但是从其他上下文(作用域)调用函数是否违反了“不依赖外部状态"?
外部的state不同于外部代码。如果纯函数不能使用外部代码,那么几乎就不会有纯函数这样的东西了。即使你的函数所做的只是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;
}
唯一的区别是代码片段的可重用性和/或可读性和可维护性。不是纯洁。
如果一个函数不会引起副作用或受到自身外部的副作用/状态的影响,那么它就是纯函数。只要它调用的所有代码也符合该规则,它就保持纯粹。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)