純粹的功能

函數語言程式設計的一個基本原則是它避免改變應用程式狀態(無狀態)和變數範圍之外的變數(不變性)。

純函式是以下功能:

  • 對於給定的輸入,始終返回相同的輸出
  • 他們不依賴於範圍之外的任何變數
  • 他們不修改應用程式的狀態( 沒有副作用

我們來看看一些例子:

純函式不得更改其範圍之外的任何變數

不純的功能

let obj = { a: 0 }

const impure = (input) => {
  // Modifies input.a
  input.a = input.a + 1;
  return input.a;
}

let b = impure(obj)
console.log(obj) // Logs { "a": 1 }
console.log(b) // Logs 1

該函式更改了超出其範圍的 obj.a 值。

純粹的功能

let obj = { a: 0 }

const pure = (input) => {
  // Does not modify obj
  let output = input.a + 1;
  return output;
}

let b = pure(obj)
console.log(obj) // Logs { "a": 0 }
console.log(b) // Logs 1

該函式沒有改變物件 obj 的值

純函式不得依賴於其範圍之外的變數

不純的功能

let a = 1;

let impure = (input) => {
  // Multiply with variable outside function scope
  let output = input * a;
  return output;
}

console.log(impure(2)) // Logs 2
a++; // a becomes equal to 2
console.log(impure(2)) // Logs 4

這個不純的函式依賴於在其範圍之外定義的變數 a。因此,如果 a 被修改,impure 的功能結果將會不同。

純粹的功能

let pure = (input) => {
  let a = 1;
  // Multiply with variable inside function scope
  let output = input * a;
  return output;
}

console.log(pure(2)) // Logs 2

pure 的函式結果不依賴於其範圍之外的任何變數。