溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中的函數(shù)式編程實(shí)例分析

發(fā)布時間:2023-02-25 10:45:34 來源:億速云 閱讀:84 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“JavaScript中的函數(shù)式編程實(shí)例分析”,在日常操作中,相信很多人在JavaScript中的函數(shù)式編程實(shí)例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript中的函數(shù)式編程實(shí)例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    分析

    函數(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ù)傳遞進(jìn)去后,總會返回相同的輸出,且不會對外界造成影響,是一個 純函數(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)用了兩次,傳遞進(jìn)去的參數(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ù)不能夠給到確定的輸出,那就很難進(jìn)行測試了。

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

    • 代碼難以被調(diào)試

    • 數(shù)據(jù)變化難以被追溯

    • 計(jì)算結(jié)果難以被復(fù)用(代碼難以封裝)

    • 程序運(yùn)行中容易出現(xiàn)各種突發(fā)性的事件

    確定性的好處

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

    • 代碼邏輯更加清晰。

    • 更容易進(jìn)行測試,結(jié)果只依賴輸入,測試時可以確保輸出穩(wěn)定。

    • 更容易維護(hù)和重構(gòu),我們可以寫出質(zhì)量更高的代碼。

    • 更容易調(diào)用,我們不用擔(dān)心函數(shù)會有什么副作用。

    • 結(jié)果可以緩存,因?yàn)橄嗤妮斎肟偸菚玫较嗤妮敵觥?/p>

    • 代碼復(fù)用性強(qiáng),提升開發(fā)者的編碼效率。

    如何對待副作用

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

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

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

    到此,關(guān)于“JavaScript中的函數(shù)式編程實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI