成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript的函數(shù)式編程介紹

tinna / 2124人閱讀

摘要:在編程的世界里有兩種基本類型的編程函數(shù)式編程強(qiáng)調(diào)將一系列的動(dòng)作組合成一個(gè)體系對(duì)象式編程強(qiáng)調(diào)將一系列的成分聚合到一個(gè)類中對(duì)于這種弱類語言來說,它既有的特點(diǎn)通過或者封裝一個(gè)類又有的特點(diǎn)。

在編程的世界里有兩種基本類型的編程:
函數(shù)式編程(OFP):強(qiáng)調(diào)將一系列的“動(dòng)作”組合成一個(gè)體系;
對(duì)象式編程(OOP):強(qiáng)調(diào)將一系列的成分聚合到一個(gè)類中;
對(duì)于javascript這種弱類語言來說,它既有OOP的特點(diǎn)(通過class或者prototype封裝一個(gè)類),又有OFP的特點(diǎn)。而接下來主要介紹一下js的OFP。

本博客主要以幾個(gè)方面介紹js的OFP:一等函數(shù),閉包,高階函數(shù),函數(shù)柯里化,函數(shù)的純度;

一等函數(shù)

定義:形容函數(shù)可以像數(shù)值一樣自由穿梭在程序的不同地方;
1)可以像數(shù)值一樣保存在一個(gè)變量之中:

const a1 = 1
const a2 = function(){...}

2)可以像數(shù)值一樣保存在數(shù)組中:

let arr = [10, 12, function(){...}]

3)可以和數(shù)值一樣成為對(duì)象的成員:

const obj = {
                a: 1,
                b: function(){...}
             }

4)可以像數(shù)值一樣立刻運(yùn)算:

(function(){...})()

5)可以作為函數(shù)的參數(shù)

function A (){...}
function B (A){...}

6)可以作為函數(shù)的返回值

function A(){ 
    return function(){...}
}

閉包

定義:(閉包的定義有多種多樣,而這里的定義是本人的理解)閉包實(shí)際上是一個(gè)函數(shù),該函數(shù)作用域能捕捉外部的綁定,并以值的形式作為外部函數(shù)的返回值;外部的綁定其實(shí)都是為了閉包的調(diào)用而定義和設(shè)置。
外部的綁定:就是外部函數(shù)定義的局部變量或者外部函數(shù)的傳參(后面會(huì)比較詳細(xì)介紹)
特點(diǎn):被捕捉的外部綁定不會(huì)隨著外部函數(shù)回收而回收,而是一會(huì)被閉包所引用,一直存在。
demo:

1)自由變量
閉包函數(shù)中所綁定的外部函數(shù)的變量;
特點(diǎn):
a)自由變量一定不會(huì)在閉包函數(shù)內(nèi)定義;
b)自由變量可以是外部函數(shù)內(nèi)的聲明,也可以是外部函數(shù)的傳參;
c)自由變量可以是變量,也可以是函數(shù);

2)變量遮蔽:
定義:兩個(gè)變量的命名相同,則出現(xiàn)變量遮蔽現(xiàn)象(該兩個(gè)變量可能存在于同一個(gè)作用域,可以能處于不同的作用域)
特點(diǎn):該變量被調(diào)用時(shí),離該變量最近的同名變量會(huì)覆蓋上面的同名變量;(簡單的說就是就近原則)

高階函數(shù)

定義:函數(shù)必須是一等函數(shù),且函數(shù)的參數(shù)中至少存在一個(gè)數(shù)參數(shù)為函數(shù)或者該函數(shù)的返回值是一個(gè)函數(shù)。

特點(diǎn):擴(kuò)展性好,靈活多變;

1)函數(shù)參數(shù)的高階函數(shù):
注意:每個(gè)函數(shù)參數(shù)都必須要確定它在函數(shù)中的作用和功能;
demo:
[{a:1,b:‘today’},{a:2,b:‘tomorrow’}]最大值所對(duì)應(yīng)的元素;

2)閉包的高階函數(shù)
注意:通過獲取外層函數(shù)的自由變量,從而定義閉包函數(shù)的行為和作動(dòng);

函數(shù)柯里化

定義:將一個(gè)接受多個(gè)參數(shù)只調(diào)用一次的函數(shù),轉(zhuǎn)變成接受一部分參數(shù)且多次調(diào)用的函數(shù)
形式:f(a1,a2,a3,...an) 等效于fn(a1,a2)(a3,...)....(an)
特點(diǎn):

每執(zhí)行一個(gè)邏輯參數(shù)都會(huì)返回一個(gè)函數(shù),知道最后一個(gè)參數(shù)調(diào)用完,參數(shù)才會(huì)執(zhí)行完。

函數(shù)的純度

純函數(shù):一個(gè)函數(shù)的輸入,輸出的值都是確定且有相同的結(jié)構(gòu),且函數(shù)內(nèi)部不存在不確定的因素的函數(shù)。
優(yōu)點(diǎn):

1)便于多帶帶測試;
2)輸入輸出的值結(jié)構(gòu)固定,不易報(bào)錯(cuò)且可預(yù)測;

缺點(diǎn):

由于結(jié)構(gòu)固定,所以失去了js函數(shù)的靈活性和動(dòng)態(tài)性;

demo:


redux中的reducer就是一個(gè)純函數(shù)形式;

不純函數(shù):函數(shù)內(nèi)部具有不確定的因素存在,常見的因素有Math.random,異步操作,輸入輸出不確定或者結(jié)構(gòu)不相同等;

優(yōu)點(diǎn):動(dòng)態(tài)性比較好,靈活(開發(fā)中經(jīng)常出現(xiàn))
缺點(diǎn):不便于預(yù)測返回的結(jié)果;

分離函數(shù)純度:
因?yàn)樵谌粘5拈_發(fā)中,不純函數(shù)經(jīng)常出現(xiàn),主要是因?yàn)樗幌窦兒瘮?shù)那樣處處受限制,相對(duì)靈活;然而正因?yàn)楸容^靈活,使得函數(shù)不好控制,處理不好就經(jīng)常出現(xiàn)錯(cuò)誤;所以可以在不純函數(shù)中分離函數(shù)純度;
定義:將不純函數(shù)中純潔部分和不純部分分開處理;
做法:將純潔部分封裝在一個(gè)內(nèi)部函數(shù)中,該內(nèi)部函數(shù)就成為不純函數(shù)的一個(gè)私有屬性;
demo:

const A = () => {
    const B = (a) => {
       return a + 1;
    }
    return Math.random + B();
}

函數(shù)式編程具有一定的優(yōu)雅性和藝術(shù)性,很多優(yōu)秀的前端框架都包含著大量的具有函數(shù)式編程 的思想。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/92195.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)編程

    摘要:函數(shù)式編程,一看這個(gè)詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語言的理解更加融會(huì)貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評(píng)論0 收藏0
  • javascript 函數(shù)編程思想

    摘要:今天這篇文章主要介紹函數(shù)式編程的思想。函數(shù)式編程通過最小化變化使得代碼更易理解。在函數(shù)式編程里面,組合是一個(gè)非常非常非常重要的思想??梢钥吹胶瘮?shù)式編程在開發(fā)中具有聲明模式。而函數(shù)式編程旨在盡可能的提高代碼的無狀態(tài)性和不變性。 最開始接觸函數(shù)式編程的時(shí)候是在小米工作的時(shí)候,那個(gè)時(shí)候看老大以前寫的代碼各種 compose,然后一些 ramda 的一些工具函數(shù),看著很吃力,然后極力吐槽函數(shù)式...

    YPHP 評(píng)論0 收藏0
  • 函數(shù)編程對(duì)JavaScript進(jìn)行斷舍離

    摘要:函數(shù)式編程一開始我并不理解。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。但是自從學(xué)習(xí)了函數(shù)式編程,我將循環(huán)都改成了使用和來實(shí)現(xiàn)。只有數(shù)據(jù)和函數(shù),而且因?yàn)楹瘮?shù)沒有和對(duì)象綁定,更加容易復(fù)用。在函數(shù)式的中,這些問題不復(fù)存在。 譯者按: 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會(huì)函數(shù)式編程時(shí),他扔掉了90%的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛啊?。?! 原文: How I rediscov...

    dkzwm 評(píng)論0 收藏0
  • 編程模型(范)小結(jié)

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<