addVat是一个纯函数吗?
function addVat(country, getVat, amount)
{
if(amount > 0) {
return amount + getVat(country)*amount
}
return amount
}
有一个函数作为参数- getVat -使addVat自动不纯?
根据getVat的实现,我们可以引入任何副作用…getVat可以返回一个随机值,使得addVat的结果不可预测。
const getVat = ()=> Math.random()
addVat('UK',getVat, 20)
产生外部副作用的案例…
const getVat = ()=> {
updateDbWithVatUsed(0.2)
return 0.2
}
addVat('UK',getVat, 20)
另一方面,单元测试是可行的,因为副作用或数据可变性在纯函数之外,我们可以存根,使测试完全可预测。
const getUKVat = ()=> 0.2
assert.equal(addVat('UK',getUkVat, 20), 24)
我的怀疑来自……是否将纯度定义为函数所做的事情,排除作为参数传递的外部调用所发生的任何事情?
否则,由于高阶函数是函数式编程的主题…如果不考虑调用因素,就不可能将函数单独分类为纯函数。
我认为这取决于getVat()
。如果getVat()
是纯的,addVat()
也是纯的:)
Javascript语言不强制纯度,因此不可能保证调用作为参数传递的函数的纯度。这篇文章可能会有帮助。