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)
唯一的区别是代码片段的可重用性和/或可读性和可维护性.不纯洁.
如果一个函数不会引起副作用或受到自身外部副作用/状态的影响,那么它就是纯粹的.只要它调用的所有代码也符合该规则,它就保持纯粹.