最佳答案
大多数 消息来源将纯函数定义为具有以下两个属性:
这是我关心的第一个条件。在大多数情况下,很容易判断。考虑以下 JavaScript 函数(如 这篇文章所示)
纯粹:
const add = (x, y) => x + y;
add(2, 4); // 6
杂质:
let x = 2;
const add = (y) => {
return x += y;
};
add(4); // x === 6 (the first time)
add(4); // x === 10 (the second time)
很容易看出,第2个函数将为后续调用提供不同的输出,因此违反了第一个条件。因此,它是不纯洁的。
这部分我懂。
现在,对于我的问题,考虑这个函数,它将给定的美元转换成欧元:
(编辑-在第一行中使用 const
。在前面无意中使用了 let
。)
const exchangeRate = fetchFromDatabase(); // evaluates to say 0.9 for today;
const dollarToEuro = (x) => {
return x * exchangeRate;
};
dollarToEuro(100) //90 today
dollarToEuro(100) //something else tomorrow
假设我们从一个分贝中取出汇率,它每天都在变化。
现在,不管我调用这个函数 今天多少次,它都会给输入 100
提供相同的输出。不过,明天可能会有不同的输出。我不确定这是否违反了第一个条件。
IOW,函数本身不包含任何逻辑来改变输入,但它依赖于一个可能在将来改变的外部常量。在这种情况下,它肯定会每天变化。在其他情况下,这种情况可能会发生,也可能不会。
我们能否调用这样的函数纯函数。如果答案是否定的,那么我们如何将其重构为一个?