最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你理解JavaScript中的函數(shù)式編程

 更新時間:2023年02月20日 10:16:33   作者:Hutao  
函數(shù)式編程 是一種 編程規(guī)范,也是一種對語言程序(比如JavaScript)本身能力的 運用方式。本篇文章將從 編程規(guī)范 來介紹函數(shù)式編程的到底是一種什么樣的規(guī)范,希望對大家有所幫助

我理解的 函數(shù)式編程 是一種 編程規(guī)范,也是一種對語言程序(比如JavaScript)本身能力的 運用方式。

就 編程規(guī)范 來說,對開發(fā)者來說可以說是一種約束,但在這種約束下,會讓我們編寫出更加可控且穩(wěn)定的程序。

就 運用方式 來說,函數(shù)式編程本身有很多經(jīng)典的運用方式,對于 JavaScript 語言本身而言,天然支持了 函數(shù)式編程,因此,我們可以直接它的一些運用方式,來擴展我們的語言運用能力。

本篇文章將從 編程規(guī)范 來介紹函數(shù)式編程的到底是一種什么樣的規(guī)范,它能帶給我們作用有什么。

分析

函數(shù)式編程核心規(guī)范就是:擁抱 純函數(shù) ,隔離 副作用 。

因此要弄清楚 函數(shù)式編程 的規(guī)范,就需要弄懂 純函數(shù) 和 副作用 概念和作用。

我們先來看一下各自的概念:

純函數(shù):就是一個函數(shù),但它需要滿足以下兩個特征:

  • 相同的輸入?yún)?shù),總會有相同的輸出
  • 在執(zhí)行過程中不會產(chǎn)生語義上可觀察的 副作用

副作用:函數(shù) 副作用 指當(dāng)調(diào)用函數(shù)時,除了返回函數(shù)值之外,還對主調(diào)用函數(shù)產(chǎn)生附加的影響。

純函數(shù)的理解依賴 副作用,因此不會分開去理解,本篇具體內(nèi)容結(jié)構(gòu):

  • 理解純函數(shù)
  • 純函數(shù)的作用
  • 如何對待副作用

理解純函數(shù)

下面我們從 純函數(shù) 的兩個特征來理解。

相同的輸入?yún)?shù),總會有相同的輸出

比如:

function add(a, b) {
    return a + b
}

add(1, 2); // 3

執(zhí)行 add 函數(shù),不管執(zhí)行多少次,不管在 JavaScript 上下文哪里執(zhí)行,相同的參數(shù)傳遞進去后,總會返回相同的輸出,且不會對外界造成影響,是一個 純函數(shù) 。

如果改成這樣:

let c = 1;

function add(a, b) {
    return a + b + c;
}

add(1, 2); // 4
c = 5;
add(1, 2); // 8

這時候 add 調(diào)用了兩次,傳遞進去的參數(shù)沒有變化,但返回結(jié)果卻不相同,它受到了外界變量的干擾,不屬于純函數(shù)。

因此,可以推斷出要想 相同的輸入?yún)?shù),總會有相同的輸出 ,函數(shù)內(nèi)部不能使用函數(shù)外部的 變量 ,但不可變的 常量 是可以的,比如在使用 redux時,定義 reducer 的 action 常常就會使用常量來定義。

相同的輸入?yún)?shù),總會有相同的輸出 可以保證我們程序的穩(wěn)定性,返回結(jié)果不受外界影響。

在執(zhí)行過程中不會產(chǎn)生語義上可觀察的 副作用

比如:

function add(a, b) {
    const result = a + b;
    console.log(result);
    return result;
}
add(1, 2); // 3

上面的 add 函數(shù)添加了 console.log 把結(jié)果打印到了瀏覽器的控制臺,屬于對外界造成了影響,產(chǎn)生了 副作用。

再比如一個請求接口的函數(shù):

async function getList(url) {
    const result = await fetch(url);
    return result;
}

內(nèi)部調(diào)用了請求函數(shù) fetch ,fetch 函數(shù)執(zhí)行后返回的內(nèi)容并不能保證每一次都一樣,受到了網(wǎng)絡(luò)和服務(wù)器等原因的影響。因此,fetch 函數(shù)本身就不是一個純函數(shù),getList 受到其影響,也變得不純了。

因此,如果一個主函數(shù)內(nèi)部調(diào)用了不純函數(shù),不純的原因還是對主函數(shù)外部產(chǎn)生了副作用或者收到了影響,那么這個函數(shù)就不是純函數(shù)。

純函數(shù) 的作用

純函數(shù) 的兩大特征,合起來可以這樣看:不受外界影響,不影響外界。也就是它可以解決程序中 不確定性 的問題。

不確定性的危害

以測試過程為例:單元測試的主要判斷的依據(jù)就是函數(shù)的輸入和輸出。如果對于同樣的輸入,函數(shù)不能夠給到確定的輸出,那就很難進行測試了。

不確定性還會導(dǎo)致我們的程序中出現(xiàn)各種風(fēng)險,比如:

  • 代碼難以被調(diào)試
  • 數(shù)據(jù)變化難以被追溯
  • 計算結(jié)果難以被復(fù)用(代碼難以封裝)
  • 程序運行中容易出現(xiàn)各種突發(fā)性的事件

確定性的好處

確定性的函數(shù)讓我們的程序更加有保障,也能解決很多實際性的問題,比如:

  • 代碼邏輯更加清晰。
  • 更容易進行測試,結(jié)果只依賴輸入,測試時可以確保輸出穩(wěn)定。
  • 更容易維護和重構(gòu),我們可以寫出質(zhì)量更高的代碼。
  • 更容易調(diào)用,我們不用擔(dān)心函數(shù)會有什么副作用。
  • 結(jié)果可以緩存,因為相同的輸入總是會得到相同的輸出。
  • 代碼復(fù)用性強,提升開發(fā)者的編碼效率。

如何對待副作用

解決 副作用 等于解決了影響外界的問題和部分不受外界影響的問題。因此消除副作用,足以解決函數(shù)中大多數(shù)的不確定性問題。

但對于一個完整的程序來說,副作用卻至關(guān)重要,沒有副作用,程序就不能和外界溝通,就不能產(chǎn)生對外界的作用,這樣程序本身就沒有了意義和價值。

因此我們要做的不是消除副作用,而是擁抱 純函數(shù) ,隔離 副作用 。將計算邏輯與副作用做合理的分層解耦,從而提升我們的編碼質(zhì)量和執(zhí)行效率。

總結(jié)

函數(shù)式編程帶來了一種編程規(guī)范,而核心就是擁抱 純函數(shù),讓我們更加注重代碼本身的質(zhì)量和運用能力。

到此這篇關(guān)于一文帶你理解JavaScript中的函數(shù)式編程的文章就介紹到這了,更多相關(guān)JavaScript函數(shù)式編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 網(wǎng)頁圖片延時加載的js代碼

    網(wǎng)頁圖片延時加載的js代碼

    大家如果使用firebug去查看的話就會發(fā)現(xiàn),當(dāng)你滾動到相應(yīng)的行時,當(dāng)前行的圖片才即時加載的,這樣子的話頁面在打開只加可視區(qū)域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁面加載的速度,對于比較長的頁面來說,這個方案是比較好的。
    2010-04-04
  • 原生js?XMLhttprequest請求onreadystatechange執(zhí)行兩次的解決

    原生js?XMLhttprequest請求onreadystatechange執(zhí)行兩次的解決

    這篇文章主要介紹了原生js?XMLhttprequest請求onreadystatechange執(zhí)行兩次的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • js精準(zhǔn)計算

    js精準(zhǔn)計算

    這篇文章主要介紹了js精準(zhǔn)計算,對此感興趣的同學(xué),可以實驗一下
    2021-04-04
  • ES6中new Function()語法及應(yīng)用實例分析

    ES6中new Function()語法及應(yīng)用實例分析

    這篇文章主要介紹了ES6中new Function()語法及應(yīng)用,結(jié)合實例形式分析了ES6中new Function()的基本語法、功能、原理、閉包等相關(guān)使用技巧,需要的朋友可以參考下
    2020-02-02
  • 常用參考資料(手冊)下載或者鏈接

    常用參考資料(手冊)下載或者鏈接

    常用參考資料(手冊)下載或者鏈接...
    2006-07-07
  • 隨機顯示經(jīng)典句子或詩歌的javascript腳本

    隨機顯示經(jīng)典句子或詩歌的javascript腳本

    這篇文章主要介紹了隨機顯示經(jīng)典句子或詩歌的javascript腳本的相關(guān)資料,需要的朋友可以參考下
    2007-08-08
  • JS如何實現(xiàn)在彈出窗口中加載頁面

    JS如何實現(xiàn)在彈出窗口中加載頁面

    這篇文章主要介紹了JS如何實現(xiàn)在彈出窗口中加載頁面,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • ES6 Promise對象概念與用法分析

    ES6 Promise對象概念與用法分析

    這篇文章主要介紹了ES6 Promise對象概念與用法,簡單分析了Promise對象的基本狀態(tài)與三種重要方法,并結(jié)合實例形式給出相關(guān)使用技巧,需要的朋友可以參考下
    2017-04-04
  • 全面解析Javascript無限添加QQ好友原理

    全面解析Javascript無限添加QQ好友原理

    這篇文章主要介紹了全面解析Javascript無限添加QQ好友原理的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Js自動截取字符串長度,添加省略號(……)的實現(xiàn)方法

    Js自動截取字符串長度,添加省略號(……)的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫s自動截取字符串長度,添加省略號(……)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論

比如县| 阿鲁科尔沁旗| 亚东县| 汝州市| 新和县| 宣化县| 合作市| 崇州市| 温州市| 商都县| 宁远县| 延川县| 鹤山市| 乐陵市| 临汾市| 青川县| 江口县| 荆门市| 鄂伦春自治旗| 石渠县| 个旧市| 孝感市| 昌都县| 曲阜市| 宁阳县| 明光市| 洛扎县| 贞丰县| 峨眉山市| 响水县| 衡阳县| 曲松县| 鄂伦春自治旗| 贺兰县| 揭阳市| 同心县| 九龙县| 宜春市| 合作市| 商都县| 东宁县|