RxJS入門1之函數響應式編程

一.函數式編程

1.聲明式(Declarativ)
和聲明式相對應的編程⽅式叫作命令式編程(ImperativeProgramming),命令式編程也是最多見的⼀種編程⽅式。javascript

//命令式編程:
function double(arr) {
    const results = []
    for (let i = 0; i < arr.length; i++){
        results.push(arr[i] * 2)
    }
    return results
}
function addOne(arr){
    const results = []
    for (let i = 0; i < arr.length; i++){
        results.push(arr[i] +1)
    }
    return results
}
//聲明式:
const double = arr => arr.map(item => item * 2);
const addOne = arr => arr.map(item => item + 1);

2.純函數(Pure Function)java

  • 函數的執⾏過程徹底由輸⼊參數決定,不會受除參數以外的任何數據影響。簡單的說,一個函數當它的輸入值一致時,返回值永遠是一致的。
  • 函數不會修改任何外部狀態,⽐如修改全局變量或傳⼊的參數對象。

相反的不純函數:react

  • 改變全局變量的值。
  • 改變輸⼊參數引⽤的對象,就像上⾯不是純函數的arrayPush實現。
  • 讀取⽤戶輸⼊,⽐如調⽤了alert或者confirm函數。
  • 拋出⼀個異常。
  • ⽹絡輸⼊/輸出操做,⽐如經過AJAX調⽤⼀個服務器的API。
  • 操做瀏覽器的DOM。

滿⾜純函數的特性也叫作引⽤透明度(Referential Transparency),這是更加正式的說法。怎麼稱呼不重要,重要的是開發者要理解,所謂的純函數,作的事情就是輸⼊參數到返回結果的⼀個映射,不要產⽣副做⽤(Side Effect)。
3.數據不可變性(Immutability)
數據不可變(Immutable)是函數式編程⾮常重要的⼀個概念,程序要好發揮做⽤固然是要產⽣變化的數據,可是並不意味着必需要去修改現有數據,替換⽅法是經過產⽣新的數據,來實現這種「變化」,也就是說,當咱們須要數據狀態發⽣改變時,保持原有數據不變,產⽣⼀個新的數據來體現這種變化。不可改變的數據就是Immutable數據,它⼀旦產⽣,咱們就能夠確定它的值永遠不會變,這⾮常有利於代碼的理解。
注意:JavaScript中的const關鍵字雖然有常數(constant)的意思,但其實只是規定⼀個變量引⽤的對象不能改變,卻沒有規定這個const變量引⽤的對象⾃⾝不能發⽣改變,因此,這個「常量」依然是變量。
問題:javascript算不算函數式編程語言?
從語言的角度上講,javascript並是純粹的函數式編程語言,JavaScript中的函數有第⼀公民的⾝份,由於函數本⾝就是⼀個對象,能夠被賦值給⼀個變量,能夠做爲參數傳遞,由此能夠很⽅便地應⽤函數式編程的許多思想。咱們把函數式編程看做⼀種編程思想,即便語⾔本⾝不⽀持⼀些特性,咱們依然能夠應⽤這樣的編程思想,⽤於提⾼代碼的質量。因此,JavaScript並非純粹的函數式編程語⾔,可是,經過應⽤⼀些編程規範,再借助⼀點⼯具的幫助,咱們徹底能夠⽤JavaScript寫出函數式的代碼,RxJS就是輔助咱們寫出函數式代碼的⼀種。編程

二.響應式編程(Reactive Programming)

就像excell,試着⽤Excel把多個星期的花費綜合加起來放在另⼀個叫c9格⼦⾥,c9可以對花費的格⼦的數值變化做出「響應」。瀏覽器

例如,在命令式編程環境中, a:=b+c表示將表達式的結果賦給 a,而以後改變 b 或 c的值不會影響 a。但在響應式編程中,a的值會隨着 b或 c的更新而更新。服務器

Reactive Extension 簡稱 Rx(響應式編程世界⾥知名度最⾼的框架)

An API for asynchronous programming with observable streams 。 Rx是⼀套經過可監聽流來作異步編程的API。框架

Rx實際上是⼀個⼤家族,在這個⼤家族中,還有⽤Java實現的RxJava,⽤C++實現的RxCpp,⽤Ruby實現的Rx.rb,⽤Python實現的RxPy,固然,還有這個⼤家族中最年長的Rx.NET。RxJS,也就是Rx的JavaScript語⾔實現。
Rx(包括RxJS)誕⽣的主要⽬的雖然是解決異步處理的問題,但並不表⽰Rx不適合同步的數據處理,實際上,使⽤RxJS以後⼤部分代碼不須要關⼼⾃⼰是被同步執⾏仍是異步執⾏,因此處理起來會更加簡單。
RxJS 屬於「函數響應式編程」。異步

函數響應式編程的優點

  • 數據流抽象了不少現實問題。
  • 擅長處理異步操做。
  • 把複雜問題分解成簡單問題的組合。
相關文章
相關標籤/搜索