不纯的函数具有副作用,下面以之前的计税函数以例进行说明
var percentValue = 5;
var calculateTax = (value) => {return value/100 * (100 + percentValue)};
复制代码
这个函数不是纯函数,主要因为它以来外部环境计算其逻辑,当外部环境改变时,它会影响结果。因此,纯函数的主要特征就是不依赖于任何外部变量,也不应该改变任何外部变量。如果改变了外部变量可能会引起其他函数的行为的改变,即产生副作用,这会使系统的行为变得难以预测。
纯函数(缓存版本)
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
补充缓存函数
function memoizeFunction(func)
{
var cache = {};
return function()
{
var key = arguments[0];
if (cache[key])
{
return cache[key];
}
else
{
var val = func.apply(this, arguments);
cache[key] = val;
return val;
}
};
}
var fibonacci = memoizeFunction(function(n)
{
return (n === 0 || n === 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
});
console.log(fibonacci(100)); // 输出354224848179262000000
console.log(fibonacci(100)); // 输出354224848179262000000
代码中,第2次计算fibonacci(100)则只需要在内存中直接读取结果。