国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:39:11
字體:
來源:轉載
供稿:網友

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

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

多使用純屬函數是因為它更可靠一些,也沒什么副作用(side effects)。你交給它同樣的值,它每次都會給你輸出同樣的結果,這種特質叫所指透明(Referential transparency) 。這會讓程序更穩定,也更容易測試。

副作用

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

看個例子:

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

greet 不是純函數,因為這個函數依賴函數以外的東西,這里就是全局作用域下的 name。這樣做的問題是,函數依賴的 name 很可能在應用運行的時候發生變化,這樣試一下:

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

這樣改一下:

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

現在函數明確的說明了自己需要的東西,這里就是 name 參數。它現在只依賴你交給它的 name 參數的值。但是這個函數仍然不是純函數,因為它在控制臺上輸出了東西,這其實改變了函數之外的東西,所以它不是純函數。這樣再改一下:

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

現在 greet 就會是一個純函數,因為它只依賴交給它的 name ,也沒有改變函數以外的東西。而且你每次給它同樣的 name 值,它每次都會給我們返回同樣的結果。這種函數用起來即安全又可靠。

所指透明

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

純函數所指的東西都是透明的,因為你給它同樣的東西,它每次都會返回一樣的結果。

const greet = (name) => { return `hello, ${name}`}const logger = (message) => { console.log(message)}logger(greet('longzhoufeng'))// 上面的表達式也可以這樣:logger('hello, longzhoufeng')// 得到的結果是一樣的,因為 greet 所指透明。// 給它一個 “longzhoufeng”,它所指的東西就是 “hello, longzhoufeng”            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 巩义市| 巴彦淖尔市| 祁东县| 万盛区| 社旗县| 九台市| 齐河县| 安宁市| 斗六市| 翁源县| 新泰市| 巴林左旗| 江安县| 永新县| 台南市| 滦南县| 儋州市| 南靖县| 丹阳市| 嵩明县| 五峰| 德清县| 白山市| 屏山县| 英吉沙县| 西畴县| 渭源县| 龙里县| 淮阳县| 新平| 东丰县| 介休市| 襄垣县| 东山县| 达拉特旗| 余庆县| 旅游| 榆树市| 汝南县| 泸溪县| 南阳市|