您好,登錄后才能下訂單哦!
這篇文章主要介紹“JavaScript中的函數式編程實例分析”,在日常操作中,相信很多人在JavaScript中的函數式編程實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript中的函數式編程實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
函數式編程核心規范就是:擁抱 純函數 ,隔離 副作用 。
因此要弄清楚 函數式編程 的規范,就需要弄懂 純函數 和 副作用 概念和作用。
我們先來看一下各自的概念:
純函數:就是一個函數,但它需要滿足以下兩個特征:
相同的輸入參數,總會有相同的輸出
在執行過程中不會產生語義上可觀察的 副作用
副作用:函數 副作用 指當調用函數時,除了返回函數值之外,還對主調用函數產生附加的影響。
純函數的理解依賴 副作用,因此不會分開去理解,本篇具體內容結構:
理解純函數
純函數的作用
如何對待副作用
下面我們從 純函數 的兩個特征來理解。
比如:
function add(a, b) { return a + b } add(1, 2); // 3
執行 add
函數,不管執行多少次,不管在 JavaScript 上下文哪里執行,相同的參數傳遞進去后,總會返回相同的輸出,且不會對外界造成影響,是一個 純函數 。
如果改成這樣:
let c = 1; function add(a, b) { return a + b + c; } add(1, 2); // 4 c = 5; add(1, 2); // 8
這時候 add
調用了兩次,傳遞進去的參數沒有變化,但返回結果卻不相同,它受到了外界變量的干擾,不屬于純函數。
因此,可以推斷出要想 相同的輸入參數,總會有相同的輸出 ,函數內部不能使用函數外部的 變量 ,但不可變的 常量 是可以的,比如在使用 redux時,定義 reducer 的 action 常常就會使用常量來定義。
相同的輸入參數,總會有相同的輸出 可以保證我們程序的穩定性,返回結果不受外界影響。
比如:
function add(a, b) { const result = a + b; console.log(result); return result; } add(1, 2); // 3
上面的 add
函數添加了 console.log
把結果打印到了瀏覽器的控制臺,屬于對外界造成了影響,產生了 副作用
。
再比如一個請求接口的函數:
async function getList(url) { const result = await fetch(url); return result; }
內部調用了請求函數 fetch
,fetch
函數執行后返回的內容并不能保證每一次都一樣,受到了網絡和服務器等原因的影響。因此,fetch
函數本身就不是一個純函數,getList
受到其影響,也變得不純了。
因此,如果一個主函數內部調用了不純函數,不純的原因還是對主函數外部產生了副作用或者收到了影響,那么這個函數就不是純函數。
純函數 的兩大特征,合起來可以這樣看:不受外界影響,不影響外界。也就是它可以解決程序中 不確定性 的問題。
以測試過程為例:單元測試的主要判斷的依據就是函數的輸入和輸出。如果對于同樣的輸入,函數不能夠給到確定的輸出,那就很難進行測試了。
不確定性還會導致我們的程序中出現各種風險,比如:
代碼難以被調試
數據變化難以被追溯
計算結果難以被復用(代碼難以封裝)
程序運行中容易出現各種突發性的事件
確定性的函數讓我們的程序更加有保障,也能解決很多實際性的問題,比如:
代碼邏輯更加清晰。
更容易進行測試,結果只依賴輸入,測試時可以確保輸出穩定。
更容易維護和重構,我們可以寫出質量更高的代碼。
更容易調用,我們不用擔心函數會有什么副作用。
結果可以緩存,因為相同的輸入總是會得到相同的輸出。
代碼復用性強,提升開發者的編碼效率。
解決 副作用 等于解決了影響外界的問題和部分不受外界影響的問題。因此消除副作用,足以解決函數中大多數的不確定性問題。
但對于一個完整的程序來說,副作用卻至關重要,沒有副作用,程序就不能和外界溝通,就不能產生對外界的作用,這樣程序本身就沒有了意義和價值。
因此我們要做的不是消除副作用,而是擁抱 純函數 ,隔離 副作用 。將計算邏輯與副作用做合理的分層解耦,從而提升我們的編碼質量和執行效率。
到此,關于“JavaScript中的函數式編程實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。