javascript函數語言程式設計簡單介紹

antzone發表於2017-04-17

函數語言程式設計現在越來越流行,但是當前網上對它的介紹還比較少。

下面就結合自己學習函數語言程式設計的一些經驗和網上查詢的資料在這裡對它做一下簡單的介紹。

目的是讓讀者能夠對函數語言程式設計方式有一個概念上的初步瞭解。

一.函數語言程式設計的概念:

所謂的函數語言程式設計就是一種程式設計正規化。

主要程式設計思想就是將運算過程儘量寫成一系列的函式巢狀形式。

先看一個簡單的程式碼例項:

現在有如下數學表示式:

[JavaScript] 純文字檢視 複製程式碼
(1 + 2) * 3 - 4

傳統的程式式程式設計,可能這樣寫:

[JavaScript] 純文字檢視 複製程式碼
var a = 1 + 2;
var b = a * 3;
var c = b - 4;

如果使用函數語言程式設計的方式實現上述計算,可以編寫為以下形式:

[JavaScript] 純文字檢視 複製程式碼
function add(a,b) {
  return a + b;
}
function multiply(a,b) {
  return a * b;
}
function subtract(a, b) {
  return a - b;
}
var result = subtract(multiply(add(1, 2), 3), 4);
console.log(result);

上面的程式碼實現了簡單的函數語言程式設計。

當然上面的程式碼只是為了表達函數語言程式設計程式碼編寫方式。如此簡單程式碼如果再用函數語言程式設計那就是自找苦吃。

二.函數語言程式設計的特點:

下面介紹一下函數語言程式設計的一些特點,當然我們不能說是函數語言程式設計獨有的,因為那是程式程式碼允許的規則,只是函數語言程式設計要充分使用這些規則,羅列如下:

(1).函式式第一類的物件:

也就是說,函式 不依賴於任何其他的物件而可以獨立存在,而在物件導向的語言中,函式 ( 方法 ) 是依附於物件的,屬於物件的一部分。所以函式可以賦值給其他的變數,作為引數傳遞給其他函式,或者作為其他函式的返回值。

[JavaScript] 純文字檢視 複製程式碼
var func = function () {
  //code
}

函式可以賦值給其他變數。

[JavaScript] 純文字檢視 複製程式碼
function map(array, func) {
  var res = [];
  for (var index = 0, len = array.length; index < len; index++) {
    res.push(func(array[index]));
  }
  return res;
}
var mapped = map([1, 3, 5, 7, 8], function (n) {
  return n = n + 1;
});
console.log(mapped);

上面的程式碼就是將函式作為引數進行傳遞。

[JavaScript] 純文字檢視 複製程式碼
function func() {
  var n = 5;
  return function (a) {
    return a + n;
  }
}
console.log(func()(1));

上面的程式碼就是將函式作為引數返回。

(2).只是進行運算,不參與I/O:

函數語言程式設計初衷是隻進行計算,而不進行I/O讀寫操作。

也就是說我們的目的儘量保證,只進行計算操作得出結果,儘可能少的去參與I/O讀寫操作,以保持計算的單純性。

當然I/O讀寫操作是不可避免的,但是我們可以做到儘可能的少。

(3).不產生副作用:

在普通的javascript操作中,可能會經常操作全域性變數,程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
var num = 0;
function func(a) {
  num = a + 1;
}
func(1);

上面的程式碼會修改全域性變數num,這就是所謂的副作用。

而函數語言程式設計目的是為了進行純粹的計算,並得出一個計算結果,所以不會產生副作用(當然需要我們控制)。

(4).使用引數儲存狀態:

在非函數語言程式設計語言中,我們可能會使用全域性性的一些變數來儲存狀態,但是函數語言程式設計要求不產生副作用,在第三個特點已經進行介紹。所以我們可以使用引數進行狀態儲存,程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
function reverse(string) {
  if (string.length == 0) {
    return string;
  }
  else {
    return reverse(string.substring(1, string.length)) + string.substring(0, 1);
  }
}
var str = "softwhy.com";
console.log(reverse(str));

上面的程式碼可以將字串反轉,通過遞迴操作來完成的,引數string儲存了當前字串的狀態。

具體實現過程可以參閱javascript實現將字串逆序排列程式碼例項一章節。

(5).引用透明:

由於不會產生副作用,儲存狀態也不使用外部變數,只是進行單純的計算操作,所以任何時候只要引數相同,引用函式所得到的返回值總是相同的。其他型別的語言,函式的返回值往往與系統狀態有關,不同的狀態之下,返回值是不一樣的。

相關文章