纯函数的定义通俗点说就是:固定的输入,得到固定的输出,不受到来自外部的任何干扰
纯函数不会随着执行次数的增加而改变输出的值,比如数组中的splice和slice,其中splice不是纯函数,而slice则为定义的纯函数,示例如下:
var xs = [1,2,3,4,5];
// 纯函数
xs.slice(0,3);
//=> [1,2,3]
xs.slice(0,3);
//=> [1,2,3]
xs.slice(0,3);
//=> [1,2,3]
// 不是纯函数
xs.splice(0,3);
//=> [1,2,3]
xs.splice(0,3);
//=> [4,5]
xs.splice(0,3);
//=> []
splice随着执行次数的增多,返回的值就出现了差异,这与纯函数的思想相背离。。。
至于不受到外部干扰的解释是,有的函数会在内部与外部的全局变量产生关联,是的函数的输出会根据外部值得变化发生改变,具体的例子如下:
// 不纯的
var minimum = 21;
var checkAge = function(age) {
return age >= minimum;
};
// 纯的
var checkAge = function(age) {
var minimum = 21;
return age >= minimum;
};
示例中不是存函数主要原因是函数内部会受到外部变量minmum的影响
追求纯函数的理由
- 可缓存性
纯函数可以根据输入来缓存结果,可以加快程序重复执行时的运算速度,具体如何实现缓存,可以单独去了解下
var squareNumber = memoize(function(x){ return x*x; });
squareNumber(4);
//=> 16
squareNumber(4); // 从缓存中读取输入值为 4 的结果
//=> 16
可缓存性还有个好处就是可以将非纯函数,缓存为纯函数,即延迟执行
- 可移植性
在js中可移植性意味着可以将函数序列化并通过socket发送。纯函数与环境无关,可以在任何地方运行
- 可测试性
因为其其固定的输入与输出,使得测试会更加的简便
- 并行代码
因为纯函数不需要访问共享内存,所以函数间也不会因为引用而进入竞争状态