addVat 是纯函数吗?
function addVat(country, getVat, amount)
{
if(amount > 0) {
return amount + getVat(country)*amount
}
return amount
}
Run Code Online (Sandbox Code Playgroud)
将函数作为参数 - getVat - 会使 addVat 自动变得不纯吗?
根据 getVat 的实现,我们可能会引入任何副作用... getVat 可能返回一个随机值,从而使 addVat 的结果不可预测。
const getVat = ()=> Math.random()
addVat('UK',getVat, 20)
Run Code Online (Sandbox Code Playgroud)
产生外用副作用的案例...
const getVat = ()=> {
updateDbWithVatUsed(0.2)
return 0.2
}
addVat('UK',getVat, 20)
Run Code Online (Sandbox Code Playgroud)
另一方面,单元测试是可行的,因为副作用或数据可变性超出了纯函数的范围,我们可以对其进行存根以使测试完全可预测。
const getUKVat = ()=> 0.2
assert.equal(addVat('UK',getUkVat, 20), 24)
Run Code Online (Sandbox Code Playgroud)
我的疑问来自......纯度是否定义为函数所做的事情排除了作为参数传递的外部调用所发生的任何事情?
否则,由于高阶函数是函数式编程的主题......这是否使得在不考虑调用考虑的情况下仅将函数本身分类为纯函数是不可能的。
javascript ×1