纯函数
1.此函数在相同的输入值时,总是产生相同的输出。函数的输出和当前运行环境的上下文状态无关。
纯函数就类似数学中的函数,函数将输入参数映射到返回值,也就是说,对于每套输入,都存在一个输出。
function test(a){
console.log(a*a);
}
test(10);
test(10);
test(10);
test(10);
2.此函数运行过程不影响运行环境,也就是无副作用(如触发事件、发起http请求、打印/log等)。
一个函数执行过程对产生了外部可观察的变化,那么就说,这个函数是有副作用的。而 纯函数没有产生任何可观察的副作用,也就是说它不能改变任何外部状态。
var num = 18;
function compare(x){
return x > num;
}
console.log(compare(20))
// 不是纯函数
// 修改一下
var num = 18;
function compare(x){
return x > 18;
}
console.log(compare(20))
// 传两个参数
var num = 18;
function compare(x,num){
return x > num;
}
console.log(compare(20,num))
// 并不是使用外部的num 而是自己作用域内的num
3. 如果是引用类型?
var arr = [];
function add(_arr){
var obj = {name:'cts'};
_arr.push(obj);
return _arr;
}
add(arr);
console.log(arr);
// 并不是纯函数 引用类型
// 修改一下
var arr = [{name:'bailibn'}];
function add(_arr){
var obj = {name:'cts'};
// 创建一个新的arr
var newArr = [];
// 将arr中的内容进行克隆
for(var i = 0;i<_arr.length;i++){
// 用克隆方法进行克隆
newArr[i] = _arr[i];
}
newArr.push(obj);
return newArr;
}
console.log(add(arr))
// 简化一下
function add(x,y){
return x+y;
}
var num1 = 1;
var num2 = 2;
add(num1,num2);// 纯函数
var GArr = [];
function add(arr){
arr.push(1);
return arr;
}
add(gArr);// 不是纯函数
// 废话说了一堆,纯函数有啥用呢?
简单来说,也就是当一个函数的输出不受外部环境影响,同时也不影响外部环境时,该函数就是纯函数,也就是它只关注逻辑运算和数学运算,同一个输入总得到同一个输出。
javascript内置函数有不少纯函数,也有不少非纯函数。
纯函数:
Array.prototype.slice
Array.prototype.map
String.prototype.toUpperCase
非纯函数:
Math.random
Date.now
Array.ptototype.splice