纯函数

对于一个函数,给定一个输入,返回一个唯一的输出。除此之外,不会对外部环境产生任何附带影响。我们机会称该函数为纯函数。所有函数内部定义的变量在函数返回之后都被垃圾回收掉。
但是,如果函数的输入是对象(Array, Function, Object),那么传入的是一个引用。对该变量的操作将会影响到原本的对象。这样的编程手法将产生附带影响,是的代码的逻辑复杂和可读性变低。
因此,很多数组函数,比如Array.mapArray.filter是以纯函数的形式实现。虽然它们的参数是一个数组变量,但是通过深度拷贝并赋值给一个新的变量,然后在新的数组上操作,来防止原始数组被更改。

  1. function changeAgeImpure(person) {
  2. person.age = 25;
  3. return person;
  4. }
  5. var alex = {
  6. name: 'Alex',
  7. age: 30
  8. };
  9. var changedAlex = changeAgeImpure(alex);
  10. console.log(alex); // { name: 'Alex', age: 25 }
  11. console.log(changedAlex); // { name: 'Alex', age: 25 }
  12. // 在非纯函数changeAgeImpure中,将对象person的age更新并返回。原始的alex对象也被影响,age更新为25。
  1. function changeAgePure(person) {
  2. var newPersonObj = JSON.parse(JSON.stringify(person));
  3. newPersonObj.age = 25;
  4. return newPersonObj;
  5. }
  6. var alex = {
  7. name: 'Alex',
  8. age: 30
  9. };
  10. var alexChanged = changeAgePure(alex);
  11. console.log(alex); // { name: 'Alex', age: 30 }
  12. console.log(alexChanged); // { name: 'Alex', age: 25 }
  13. // 纯函数
  14. // 通过JSON.sringify将对象变为一个字符串,然后再通过JSON.parse将字符串变回对象。通过该操作会生成一个新的对象。