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

JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法分析

 更新時(shí)間:2019年05月22日 08:49:59   作者:longzhoufeng  
這篇文章主要介紹了JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法,結(jié)合實(shí)例形式分析了javascript函數(shù)式編程中純函數(shù)的函數(shù)依賴、所指透明等概念相關(guān)原理及使用技巧,需要的朋友可以參考下

本文實(shí)例講述了JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法。分享給大家供大家參考,具體如下:

函數(shù)式編程鼓勵(lì)我們多創(chuàng)建純函數(shù)(pure functions),純函數(shù)只依賴你交給它的東西,不使用任何函數(shù)以外的東西,也不會(huì)影響到函數(shù)以外的東西。跟純函數(shù)對應(yīng)的就是不純函數(shù)(impure functions),也就是不純函數(shù)可能會(huì)使用函數(shù)以外的東西,比如使用了一個(gè)全局變量。也可能會(huì)影響到函數(shù)以外的東西,比如改變了一個(gè)全局變量的值。

多使用純屬函數(shù)是因?yàn)樗煽恳恍?,也沒什么副作用(side effects)。你交給它同樣的值,它每次都會(huì)給你輸出同樣的結(jié)果,這種特質(zhì)叫所指透明(Referential transparency) 。這會(huì)讓程序更穩(wěn)定,也更容易測試。

副作用

純函數(shù)沒副作用,有副作用的函數(shù)都不純。我吃了一片感冒藥,是要治我的感冒,但副作用是它讓我想睡覺。函數(shù)的副作用多數(shù)表現(xiàn)為函數(shù)依賴或者改變了它以外的東西。

看個(gè)例子:

let name = 'longzhoufeng'
const greet = () => {
 console.log(`hello, ${name}`)
}

greet 不是純函數(shù),因?yàn)檫@個(gè)函數(shù)依賴函數(shù)以外的東西,這里就是全局作用域下的 name。這樣做的問題是,函數(shù)依賴的 name 很可能在應(yīng)用運(yùn)行的時(shí)候發(fā)生變化,這樣試一下:

greet() // 輸出:“hello, longzhoufeng”
let name = 'longzhoupeng' // name 的值被改變了
greet() // 輸出:“hello, longzhoupeng”

這樣改一下:

const greet = (name) => {
 console.log(`hello, ${name}`)
}

現(xiàn)在函數(shù)明確的說明了自己需要的東西,這里就是 name 參數(shù)。它現(xiàn)在只依賴你交給它的 name 參數(shù)的值。但是這個(gè)函數(shù)仍然不是純函數(shù),因?yàn)樗诳刂婆_(tái)上輸出了東西,這其實(shí)改變了函數(shù)之外的東西,所以它不是純函數(shù)。這樣再改一下:

const greet = (name) => {
 return `hello, ${name}`
}

現(xiàn)在 greet 就會(huì)是一個(gè)純函數(shù),因?yàn)樗灰蕾嚱唤o它的 name ,也沒有改變函數(shù)以外的東西。而且你每次給它同樣的 name 值,它每次都會(huì)給我們返回同樣的結(jié)果。這種函數(shù)用起來即安全又可靠。

所指透明

所指透明(Referential transparency)。比如我說:“中國的首都”。我的表達(dá)所指的意思就是 “北京”,沒什么其它的隱含的意思。所以可以說我的表達(dá)所指是透明的(Referentially transparent)。再比如:“我有點(diǎn)餓”。這個(gè)表達(dá)所指就不透明,我表達(dá)的到底是什么意思是不能確定的,我可能是想出去吃點(diǎn)東西,也可能是想讓你幫我買點(diǎn)東西回來吃。

純函數(shù)所指的東西都是透明的,因?yàn)槟憬o它同樣的東西,它每次都會(huì)返回一樣的結(jié)果。

const greet = (name) => {
 return `hello, ${name}`
}
const logger = (message) => {
 console.log(message)
}
logger(greet('longzhoufeng'))
// 上面的表達(dá)式也可以這樣:
logger('hello, longzhoufeng')
// 得到的結(jié)果是一樣的,因?yàn)?greet 所指透明。
// 給它一個(gè) “l(fā)ongzhoufeng”,它所指的東西就是 “hello, longzhoufeng”

因?yàn)?greet 所指透明,所以如果我們在表達(dá)式中把它替換成它所指的東西,不會(huì)影響到程序的運(yùn)行。比如在一個(gè)表達(dá)式里所有使用 greet('longzhoufeng') 的地方,我們都可以把 greet('longzhoufeng') 替換成 hello, longzhoufeng,這是因?yàn)?greet('longzhoufeng') 所指的東西就是字符串 hello, longzhoufeng 。

參考資料

http://stackoverflow.com/questions/210835/what-is-referential-transparency

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • apply和call方法定義及apply和call方法的區(qū)別

    apply和call方法定義及apply和call方法的區(qū)別

    apply和call功能一樣,只是傳入的參數(shù)列表形式不同,本文給大家介紹apply和call方法定義及apply和call方法的區(qū)別,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • IE與firefox下Dhtml的一些區(qū)別小結(jié)

    IE與firefox下Dhtml的一些區(qū)別小結(jié)

    IE與Mozilla下Dhtml的一些區(qū)別小結(jié)
    2009-12-12
  • 利用JavaScript獲取用戶IP屬地方法詳解

    利用JavaScript獲取用戶IP屬地方法詳解

    最近很多平臺(tái)都上線了顯示用戶的位置信息的功能,那么這是如何做到的, 據(jù)說這個(gè)位置信息的準(zhǔn)確性在通信網(wǎng)絡(luò)運(yùn)營商那里?本文將來探究一下
    2022-05-05
  • 原生JS實(shí)現(xiàn)音樂播放器

    原生JS實(shí)現(xiàn)音樂播放器

    這篇文章主要為大家詳細(xì)介紹了原生JS音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • javascript獲取select標(biāo)簽選中的值

    javascript獲取select標(biāo)簽選中的值

    這篇文章主要介紹javascript獲取select標(biāo)簽選中的值方法,比較實(shí)用,需要的朋友可以參考下。
    2016-06-06
  • Javascript createElement和innerHTML增加頁面元素的性能對比

    Javascript createElement和innerHTML增加頁面元素的性能對比

    Javascript之createElement和innerHTML增加頁面元素的性能對比
    2009-09-09
  • 通過JavaScript實(shí)現(xiàn)圖片壓縮

    通過JavaScript實(shí)現(xiàn)圖片壓縮

    在學(xué)習(xí)的時(shí)候,有時(shí)候看到一些一些網(wǎng)站的圖片是經(jīng)過壓縮處理的,因?yàn)閴嚎s之后的圖片會(huì)節(jié)省一部分你的內(nèi)存空間,這樣的話也可以提升性能,于是就比較好奇這是如何實(shí)現(xiàn)的,今天我們就簡單的實(shí)現(xiàn)一下,需要的朋友可以參考下
    2023-06-06
  • js前端存儲(chǔ)之sessionStorage使用方法舉例

    js前端存儲(chǔ)之sessionStorage使用方法舉例

    sessionStorage是指本地存儲(chǔ)一個(gè)會(huì)話中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會(huì)話中的頁面才能訪問并且當(dāng)會(huì)話結(jié)束后數(shù)據(jù)也隨之銷毀,這篇文章主要給大家介紹了關(guān)于js前端存儲(chǔ)之sessionStorage使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • JavaScript實(shí)現(xiàn)淘寶京東6位數(shù)字支付密碼效果

    JavaScript實(shí)現(xiàn)淘寶京東6位數(shù)字支付密碼效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)淘寶京東6位數(shù)字支付密碼效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 一篇文章搞定echarts地圖輪播高亮

    一篇文章搞定echarts地圖輪播高亮

    ECharts是一個(gè)使用 JavaScript 實(shí)現(xiàn)的開源可視化庫,涵蓋各行業(yè)圖表,滿足各種需求,下面這篇文章主要給大家介紹了關(guān)于echarts地圖輪播高亮的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評論

南丰县| 遵化市| 固始县| 巫山县| 兰西县| 恩平市| 南澳县| 甘孜县| 莎车县| 墨竹工卡县| 新昌县| 莆田市| 阳信县| 平度市| 萝北县| 平陆县| 安康市| 剑阁县| 河池市| 芦溪县| 庄河市| 汶川县| 泗阳县| 鸡东县| 嵩明县| 贵港市| 岳阳市| 乌拉特前旗| 敦煌市| 鄢陵县| 宝山区| 余庆县| 四子王旗| 惠来县| 安徽省| 阿坝县| 嵊泗县| 将乐县| 宽甸| 鹰潭市| 榕江县|