成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

初見函數(shù)式編程

jerryloveemily / 573人閱讀

摘要:在學(xué)習(xí)的過程中時(shí)常會(huì)聽到一個(gè)名次函數(shù)式編程,那么究竟什么是函數(shù)式編程,函數(shù)式編程又有什么優(yōu)點(diǎn),這就在這篇博客進(jìn)行一個(gè)簡(jiǎn)單的總結(jié)吧主要內(nèi)容函數(shù)式編程的概念函數(shù)式編程的優(yōu)點(diǎn)與示例什么是函數(shù)式編程首先,我們放下編程的概念,我們來看函數(shù)。

在學(xué)習(xí) JS 的過程中時(shí)常會(huì)聽到一個(gè)名次——“函數(shù)式編程”,那么究竟什么是函數(shù)式編程,函數(shù)式編程又有什么優(yōu)點(diǎn),這就在這篇博客進(jìn)行一個(gè)簡(jiǎn)單的總結(jié)吧~

主要內(nèi)容:

函數(shù)式編程的概念

函數(shù)式編程的優(yōu)點(diǎn)與示例

什么是函數(shù)式編程

首先,我們放下編程的概念,我們來看函數(shù)。

函數(shù)的概念來自于數(shù)學(xué),數(shù)學(xué)中的函數(shù) f(x) = y 有一個(gè)非常重要的特點(diǎn)對(duì)于一個(gè)給定的 x,有唯一的 y 與其對(duì)應(yīng)(這就是為什么橢圓曲線不是函數(shù))

然而在編程中,函數(shù)并不具有這個(gè)特點(diǎn),舉個(gè)栗子:

let val = 1
function add(x){
    return x + val
}
console.log(add(1)) // 2
val += 1
console.log(add(1)) // 3

可以看到編程中的函數(shù)在參數(shù)相同的情況下,允許有不同的返回值——只要依賴于函數(shù)外部的量

那么當(dāng)函數(shù)依賴于外部的變量(常量不會(huì)有這樣的問題),并且函數(shù)在多處調(diào)用,就有可能出現(xiàn) bug,函數(shù)的調(diào)用結(jié)果可能會(huì)和預(yù)期結(jié)果相去甚遠(yuǎn)

函數(shù)式編程就要求我們規(guī)避這樣的情況,讓所有函數(shù)對(duì)于相同的輸入的返回值相同,這樣的特性就叫做引用透明性,這就是函數(shù)式編程的核心特性!

一個(gè)符合引用透明性的函數(shù)的栗子:

function id(x){ return x; }
函數(shù)式編程帶來的優(yōu)點(diǎn)

在上文中提到過,編程語言中的函數(shù)大多是不滿足數(shù)學(xué)中的函數(shù)的概念的,so 我們將滿足數(shù)學(xué)函數(shù)條件的函數(shù)稱為“純函數(shù)”

函數(shù)式編程的優(yōu)點(diǎn)大多都來自于純函數(shù)

可測(cè)試性

除了測(cè)試人員進(jìn)行的全方位測(cè)試外,我們?cè)陂_發(fā)過程中往往要對(duì)自己寫的代碼進(jìn)行模塊測(cè)試

在開發(fā)中,我受非純函數(shù)迫害已久,由于它依賴了外部變量(比如存儲(chǔ)在 localStorage 中的數(shù)據(jù))我不得不三番五次去檢查這些外部變量是否在某個(gè)過程中被改變甚至是刪除

let val = 1
function add(x){
    return x + val
}
console.log(add(1)) // 2
// 在未知因素影響下 val被改變
console.log(add(1)) // 預(yù)期結(jié)果 2,實(shí)際輸出 emmmmm

如果我沒有注意外部依賴而是一頭扎進(jìn)函數(shù)邏輯里,可能永遠(yuǎn)都找不到這個(gè)bug

代碼的并發(fā)性

雖然我們都知道 JS 是一門單線程語言(關(guān)于JS的執(zhí)行可以參見->技術(shù)總結(jié)——JS的執(zhí)行順序),但是我們?yōu)榱颂岣咔岸说男阅芸赡軙?huì)通過 WebWorker 來并發(fā)執(zhí)行多個(gè)任務(wù),或者在 Node 環(huán)境下 JS 并發(fā)執(zhí)行函數(shù)

這個(gè)時(shí)候就是對(duì)非純函數(shù)的一個(gè)很大的考驗(yàn):

let global = "全局變量"
let func1 = ()=>{
    global = "全局變量被改變了"
    // 一些邏輯
}
let func2 = ()=>{
    if(global = "全局變量"){
        return true
    }
}

上面的兩個(gè)函數(shù)都依賴于外部的global,當(dāng)它們并發(fā)執(zhí)行,func1就會(huì)對(duì)func2產(chǎn)生影響,如果將它們變?yōu)榧兒瘮?shù)就不會(huì)有這樣的問題:

let global = "全局變量"
let func1 = (x)=>{
    x = "全局變量被改變了"
    // 一些邏輯
}
let func2 = (x)=>{
    if(x = "全局變量"){
        return true
    }
}
函數(shù)執(zhí)行的緩存

當(dāng)我們的函數(shù)都是純函數(shù),而我們又會(huì)多次調(diào)用函數(shù),我們就可以對(duì)函數(shù)對(duì)象進(jìn)行一個(gè)緩存

比如我們需要大量計(jì)算數(shù)字的4次方,我們可以建立一個(gè)映射表用來緩存函數(shù)的執(zhí)行結(jié)果:

// 映射表
let fourTimesTable = {};
let fourTimes = (x){
    return x*x*x*x
}
// 檢查表中是否有 2 的四次方,如果有就返回,如果沒有就執(zhí)行函數(shù)避免運(yùn)算
fourTimesTable.hasOwnProperty(2)");2]:
    fourTimesTable[2] = fourTimes(2)
管道與組合

管道過濾器是一種很經(jīng)典的設(shè)計(jì)模式,我們可以將這種模式和函數(shù)式編程結(jié)合起來

在管道和過濾器軟件體系結(jié)構(gòu)中,每個(gè)模塊都有一組輸入和一組輸出。每個(gè)模塊從它的輸入端接收輸入數(shù)據(jù)流,在其內(nèi)部經(jīng)過處理后,按照標(biāo)準(zhǔn)的順序,將結(jié)果數(shù)據(jù)流送到輸出端,以達(dá)到傳遞一組完整的計(jì)算結(jié)果實(shí)例的目的。

在這種結(jié)構(gòu)中,各模塊之間的連接器充當(dāng)了數(shù)據(jù)流的導(dǎo)管,將一個(gè)過濾器的輸出傳到下一個(gè)過濾器的輸入端。所以,這種連接器稱為“管道”。

我們也可以將這樣的私用運(yùn)用在函數(shù)式編程中,將一個(gè)個(gè)函數(shù)作為過濾器,通過函數(shù)的組合,形成一條數(shù)據(jù)處理的通路:

// 參數(shù)累加
function add(...args){
    let result = args.reduce((prev, cur, index, arr)=> {
        return prev + cur;
    })
    return result
}
// 參數(shù)累乘
function times(...args){
    let result = args.reduce((prev, cur, index, arr)=> {
        return prev * cur;
    })
    return result
}

let arr1=[1,3,6],arr2=[2,5,21],arr3=[3,7,8,27,4]
// 三組數(shù)據(jù),要求組內(nèi)累乘,然后結(jié)果累加
add(times(...arr1),times(...arr2),times(...arr3))
// 三組數(shù)據(jù),要求組內(nèi)累加,然后結(jié)果累乘
times(add(...arr1),add(...arr2),add(...arr3))

對(duì)函數(shù)式編程的初探暫止于此,進(jìn)一步學(xué)習(xí)后再做總結(jié)~

本文同步發(fā)布于我的個(gè)人博客,CSDN,掘金

如果有什么問題,意見,建議歡迎評(píng)論;如果覺得我寫的不錯(cuò),那就點(diǎn)個(gè)贊吧~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7847.html

相關(guān)文章

  • 關(guān)于VUE響應(yīng)數(shù)據(jù)的最佳解釋

    摘要:遍歷執(zhí)行其中存儲(chǔ)的所有的匿名函數(shù)。如果我們使用一個(gè)類來管理相關(guān)依賴,這很接近的表現(xiàn)方式代碼看起來就像下面這樣你會(huì)發(fā)現(xiàn)現(xiàn)在匿名函數(shù)被儲(chǔ)存在而不是原來的。 許多前端框架(如Angular,React,Vue)都有自己的響應(yīng)式引擎。通過理解如何響應(yīng),提議提升你的開發(fā)能力并能夠更高效地使用JS框架。本文中構(gòu)建的響應(yīng)邏輯與Vue的源碼是一毛一樣的! 響應(yīng)系統(tǒng) 初見時(shí),你會(huì)驚訝與Vue的響應(yīng)系統(tǒng)。...

    endiat 評(píng)論0 收藏0
  • 初見Flask

    摘要:接收用戶請(qǐng)求并分析請(qǐng)求的。執(zhí)行函數(shù)并生成響應(yīng),返回給瀏覽器。這個(gè)過程我們稱為注冊(cè)路由,路由負(fù)責(zé)管理和函數(shù)之間的映射,而這個(gè)函數(shù)則被稱為視圖函數(shù)。文件是一個(gè)名為的文本文件,它存儲(chǔ)了項(xiàng)目中提交時(shí)的忽略文件規(guī)則清單。 flask簡(jiǎn)述 Flask 是一個(gè)基于 Python 開發(fā)并且依賴 jinja2 模板和 Werkzeug WSGI 服務(wù)的一個(gè)微型框架,對(duì)于 Werkzeug 本質(zhì)是 Soc...

    tomorrowwu 評(píng)論0 收藏0
  • Redux 初見

    摘要:函數(shù)的作用是,返回一個(gè)最終的函數(shù),做的事情是得到一個(gè)由多個(gè)不同函數(shù)作為可以自定義的對(duì)象。把數(shù)據(jù)放到一個(gè)對(duì)象列表中,每個(gè)數(shù)據(jù)用作為主鍵。不同類型的對(duì)象通過引用數(shù)據(jù),這樣數(shù)據(jù)發(fā)生改變的時(shí)候,只需要修改一處地方,減少數(shù)據(jù)冗余或者混用。 Redux初見 本文記錄的是自己對(duì)redux的學(xué)習(xí)和理解,希望可以簡(jiǎn)潔易懂,入門redux,一步步的走進(jìn)redux! Redux是什么 Redux是Java...

    trigkit4 評(píng)論0 收藏0
  • koa2系列教程:koa2應(yīng)用初見

    摘要:系列教程,持續(xù)更新系列教程應(yīng)用初見系列教程處理靜態(tài)文件系列教程使用模板引擎系列教程路由控制中間件系列教程綜合搭建登錄注冊(cè)頁面系列教程實(shí)現(xiàn)登錄注冊(cè)功能這篇教程主要介紹構(gòu)建服務(wù)器,簡(jiǎn)單引用本教程的版本要格外注意版本號(hào)案例簡(jiǎn)單利用搭建服務(wù)器文件夾 koa2系列教程,持續(xù)更新 koa2系列教程:koa2應(yīng)用初見 koa2系列教程:koa2處理靜態(tài)文件 koa2系列教程:koa2使用模板引擎 ...

    import. 評(píng)論0 收藏0
  • 第一眼——ES6

    摘要:別色瞇瞇的不想走啦行行行,再看一眼瞧得咋地半夜看的同學(xué),對(duì)不起不很酥胡。解決了以前那些無處安放的對(duì)象和作用域問題。要是您忘不了,之后還有的。。。 越來越多的框架推薦使用ES6進(jìn)行高效開發(fā),node也早已支持ES6,那不如就偷偷瞄一眼兒這性感的編程語言?獻(xiàn)給初學(xué)者 Go~ ES6的一些特性 檢測(cè)本地是否支持ES6環(huán)境簡(jiǎn)便方法:直接在瀏覽器調(diào)試工具下嘗試輸入Promise(ES6的新API...

    617035918 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<