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

資訊專欄INFORMATION COLUMN

javascript函數(shù)式編程入門小結(jié)

includecmath / 2039人閱讀

摘要:前言最近花了不少時間接觸學習的函數(shù)式的編程方式,而后為了加深理解,又去折騰。不過幸運的是,天生具備了函數(shù)式編程的基本元素,所以學習的起點不會太低。初接觸第一個實例,函數(shù)式編程是如何做一個番茄炒雞蛋的。

前言

最近花了不少時間接觸學習javascript的函數(shù)式的編程方式,而后為了加深理解,又去折騰haskell。

不同于人們比較熟悉的命令式編程,如面向?qū)ο缶幊蹋╫op),函數(shù)式編程(fp)是一種更加抽象,更加‘數(shù)學’的編程方式。
當然,也是一種更加‘痛苦’的編程方式,尤其是剛接觸時,總是難以擺脫的命令式的思維方式,大腦回路總是會迷路。
不過幸運的是,javascript天生具備了函數(shù)式編程的基本元素,所以學習的起點不會太低。

初接觸

第一個實例,函數(shù)式編程是如何做一個番茄炒雞蛋的。
偽代碼,對比oop:

Class Chef{
  cook(m1,m2){
    return m1+m2
  }
}
chef = new Chef
food = chef.cook("番茄","雞蛋")
food //番茄炒蛋。

fp的方式

getMaterial(m){
  return function(){
    return m
  }
}
cook(getM1,getM2){
  return getM1()+getM2()
}
food = cook(getMaterial("番茄"),getMaterial("雞蛋"));
food //番茄炒蛋

那么現(xiàn)在,站在內(nèi)存(擬作:你)變化的角度上,這兩者的區(qū)別之處。
oop

1.你面前出現(xiàn)了一個廚師

2.你前面出現(xiàn)了番茄,雞蛋

3.廚師把番茄和雞蛋炒在一起

4.廚師把番茄炒蛋裝在盤子上

4.你獲得了番茄炒蛋

fp

1.你拿一個空盤子,你決定弄點東西在上面

2.你面前出現(xiàn)了一個傳說中的廚具。 //沒錯!小當家同款廚具,只要丟材料進去,它就能弄出美味佳肴!

3.你雖然沒有材料,但幸運的是,你有兩張藏寶圖,分別標示了番茄和雞蛋的位置。通過藏寶圖,就能找到所需的材料。

4.你把兩張藏寶圖扔到廚具里,告訴它,它得自己去找材料。 //傳說中的廚具就是這么牛逼!

5.廚具獲得了番茄

6.廚具獲得了雞蛋

7.廚具終于炒了番茄和雞蛋

7.finally,你獲得了番茄炒蛋

對比一下這個過程,可以發(fā)現(xiàn):

oop方式總是是在告訴系統(tǒng),第一步應(yīng)該干什么(搞個廚師)然后干什么(弄到番茄和雞蛋)、按部就班,最后你就能得到想要的值(番茄炒蛋)。

fp方式呢,恰恰相反,它是惰性的。只有你需要什么的時候,函數(shù)才會運算,才會返回數(shù)值,而不是一開始就存在的。

就好像學渣考90分,是因為在考試之前,他努力學習,到了90分。
這是結(jié)果。
而學霸考90分,只是因為考試的時候,做到90分時,懶癌發(fā)作,不想做題了。
這是過程。

fp的特性

這里列舉了當前接觸到fp中編程思想中的幾個重要特性

1.不可變數(shù)據(jù)
2.函數(shù)是一等公民,即能作為參數(shù),也可以是返回值
3.惰性求值

1.不可變數(shù)據(jù)

由于fp中都是函數(shù),為了保證程序的可靠性,同樣的參數(shù),傳入同一套的函數(shù)中,必須保證結(jié)果也是一樣的。如:

let o = {name:"zhouyg"};
r1 = fn1(fn2(fn3(o)))
r2 = fn1(fn2(fn3(o)))
r1 === r2 //true

在javascript中的由于Array和Object的類型都是引用傳遞的。如果在函數(shù)內(nèi)部改變了改變了原始o的值,那么改變了原始o的值,那么必然導(dǎo)致r1和r2的結(jié)果不一樣。導(dǎo)致程序不可靠,不可維護。
這是javascript的特性引起的,需要額外的手段補救。

每次傳遞Object和Array時候,都做一個拷貝,使用拷貝后的對象作為函數(shù)參數(shù)

或者使用某些數(shù)據(jù)結(jié)構(gòu)工具,例如F家著名的immutable.js

2.函數(shù)是一等公民

javascript天然滿足,常見的各種回調(diào)。

3.惰性求值

顧名思義,只有在需要用到的才去計算。這里強行設(shè)定一種情景,如一個加法函數(shù):
沒有惰性求值

function add(n1,n2){
  if(n1<5){
    return n1
  }else{
    return n1+n2
  }
}
result = add(add(1,2),add(3,4)) //相當于add(3,4)的計算是浪費的。
result//3

惰性求值

function add(n1,n2){
  return n1+n2;
}
function preAdd(n1,n2){
  return function(){
    return add(n1,n2)
  }
}
function doAdd(fn1,fn2){
  n = fn1()
  if(n<5){
    return n     //只需要運行fn1,得到一個計算結(jié)果即可。
  }else{
    return add(fn1,fn2())
  }
}
result = doAdd(preAdd(1,2),preAdd(3,4))
result//10

對比一下可知,在javascript中的惰性求值,相當于先把參數(shù)先緩存著,return一個真正執(zhí)行的計算的函數(shù),等到需要結(jié)果采去執(zhí)行。
這樣的好處在于比較節(jié)省計算,尤其有時候這個在函數(shù)是不一定需要這個參數(shù)的時候。

最后

這里只是簡單的回溯最近學習的fp的相關(guān)內(nèi)容。并不是為了比較fp方式和其它編程方式的優(yōu)劣,而是希望能夠站在另外的一個角度,活躍大腦的思維,開拓視野,以更豐富的姿勢來解決問題,畢竟俗話說得好,姿勢就是力量。

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

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

相關(guān)文章

  • 前端_JavaScript

    摘要:為此決定自研一個富文本編輯器。例如當要轉(zhuǎn)化的對象有環(huán)存在時子節(jié)點屬性賦值了父節(jié)點的引用,為了關(guān)于函數(shù)式編程的思考作者李英杰,美團金融前端團隊成員。只有正確使用作用域,才能使用優(yōu)秀的設(shè)計模式,幫助你規(guī)避副作用。 JavaScript 專題之惰性函數(shù) JavaScript 專題系列第十五篇,講解惰性函數(shù) 需求 我們現(xiàn)在需要寫一個 foo 函數(shù),這個函數(shù)返回首次調(diào)用時的 Date 對象,注意...

    Benedict Evans 評論0 收藏0
  • Javascript函數(shù)編程小結(jié)

    摘要:源起函數(shù)式編程近幾年非常流行經(jīng)常可以在網(wǎng)上看到別人討論相關(guān)話題我機緣巧合之下在上看到有人提到一個講函數(shù)式編程的視頻看過之后突然茅塞頓開瞬間把之前零碎的關(guān)于函數(shù)式編程的知識一下子都聯(lián)系了起來于是自己希望趁有空把這些知識總結(jié)一下這樣既可以回顧下 源起 函數(shù)式編程近幾年非常流行,經(jīng)??梢栽诰W(wǎng)上看到別人討論相關(guān)話題. 我機緣巧合之下在github上看到有人提到一個講js函數(shù)式編程的視頻,看過之...

    zengdongbao 評論0 收藏0
  • 編程 —— 函數(shù)編程入門

    摘要:在函數(shù)式編程中數(shù)據(jù)在由純函數(shù)組成的管道中傳遞。函數(shù)式編程中函子是實現(xiàn)了函數(shù)的容器下文中將函子視為范疇,模型可表示如下但是在函數(shù)式編程中要避免使用這種面向?qū)ο蟮木幊谭绞饺《畬ν獗┞读艘粋€的接口也稱為。 showImg(https://segmentfault.com/img/remote/1460000018101204); 該系列會有 3 篇文章,分別介紹什么是函數(shù)式編程、剖析函數(shù)...

    flyer_dev 評論0 收藏0
  • 編程模型(范小結(jié)

    摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語言基本都具有面向?qū)ο蟮乃枷耄热绲鹊?,而面向?qū)ο蟮闹饕枷雽ο?,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學習生活中會常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向?qū)ο蟮牡鹊?,這個編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當你新接觸一門語言的時候,有些問題是需...

    miya 評論0 收藏0

發(fā)表評論

0條評論

includecmath

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<