久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

javascript為什么用函數式編程

原因:1、js的語法是從Scheme這種函數式編程語言借鑒而來。2、就瀏覽器端而言,隨著各種單頁框架的發展,客戶端的處理能力不斷提升,越來越多的業務邏輯被放到端,從而導致客戶端要維護的狀態越來越多;隨之而來的問題是,一不小心就會大量使用依賴于外部變量的函數,這些函數隨著業務邏輯不斷增加,從而導致邏輯分支劇增,狀態難以追蹤,代碼可讀性差,難以維護,而函數式編程有著很好的解決方案。

javascript為什么用函數式編程

前端(vue)入門到精通課程:進入學習
API 文檔、設計、調試、自動化測試一體化協作工具:點擊使用

本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

一、什么是函數式編程?

函數式編程(Functional programming),簡稱 FP,并不是什么庫或者框架,與過程式編程(Procedural programming)相對,而是一種編程范式。FP 通過聲明純函數抽象數據的處理,來避免或盡可能減少函數調用對于外部狀態和系統產生的副作用。

所謂副作用,大抵有改變函數外系統狀態,向外拋出異常,處理用戶操作,修改入參,數據庫查操作,DOM操作等等可能會引起系統錯誤操作。

二、為什么在 JavaScript 使用函數式編程思想

2.1 從語言特性來看

JavaScript 一開始的語法就是從 Scheme 這種函數式編程語言借鑒而來。隨著語言標準的推進,語言本身的功能性不斷豐富,閉包、箭頭函數、高階函數,數組迭代等等功能都讓 JavaScript 中實現 FP 變得簡單,簡單講幾個特性:

2.1.1. lambda 表達式

lambda 表達式其實是一個匿名函數,使用箭頭清晰的表示輸入輸出的映射關系,JavaScript 中使用箭頭函數來實現。

const multiply = x => x * x multiply(6) // 36
登錄后復制

2.1.2 高階函數

高階( Higher-order )函數可以接受一個或者多個函數作為入參,輸出一個函數。

簡單寫兩個例子

const add = x => y => x + y const add10 = add(10) add10(5) // 15 const compose = (...fns) => x =>  fns.reduce((acc, fn) => fn(acc), x) const a = x => x + 1 const b = x => x + 2 const composedFn = compose(a, b) composedFn(1) // 1 + 1 + 2 = 4
登錄后復制

2.1.3 filter map forEach reduce 迭代

Array.prototype 下的 filter map forEach reduce 都是高階函數,因為入參是個函數。

const flatten = (arr = []) => arr.reduce(   (acc, val)=> accconcat(Array.isArray(val) ? flatten(val) : val),   [] ) let arr = [1,[ 4, 5 ], 2, 3]; flatten(arr)  // [1, 4, 5, 2, 3]
登錄后復制

2.2 從實際需求角度來看

就瀏覽器端而言,隨著各種單頁框架的發展,客戶端的處理能力不斷提升,越來越多的業務邏輯被放到端,從而導致客戶端要維護的狀態越來越多。隨之而來的問題是,我們一不小心就會大量使用依賴于外部變量的函數,這些函數隨著業務邏輯不斷增加,從而導致邏輯分支劇增,狀態難以追蹤,代碼可讀性差,難以維護,而 FP 恰恰有著很好的解決方案。

另外,現在主流的編程語言基本上都引入函數式編程的特性,即使是以面向對象著稱的 java,通過使用 stream + lambda 表達式,依然可以實踐函數式編程思想,而 Spring5 更是將 Reactive 作為主要賣點,總之 FP 近來很火。

而 JS 的函數式編程生態也在不斷豐富, RxJS, circleJS 等框架在前端產線上的應用也越來越廣。

三、使用函數式的優點

使用 FP 編程主要有以下幾個優點:

  • 將數據和處理邏輯分離,代碼更加簡潔,模塊化,可讀性好

  • 容易測試,測試環境容易模擬

  • 邏輯代碼可復用性強

四、函數式編程相關概念

函數式編程的實現主要依賴于:

  • 聲明式編程

  • 純函數

  • 不可變數據

4.1 聲明式編程

聲明式編程 Declarative programming 只描述目標的性質,從而抽象出形式邏輯,告訴計算機需要計算什么而不是如何一步步計算。例如正則、SQL、 FP 等。

指令式編程 Imperative Programming 告訴計算機每一步的計算操作

最簡單的,相同的數組處理,使用 for 循環是指令式,用 map 之類的操作是聲明式。使用聲明式編程,簡化了代碼,提高了復用率,為重構留有余地。

4.2 純函數

純函數簡要概括有兩個特點:

  • 函數的輸出只與輸入有關,相同輸入產生的輸出一致,并不會不依賴外部條件

  • 函數調用不會改變函數域以外的狀態或者變量,不會對系統產生副作用

看個簡單的例子:

let counter = 0 const increment = () => ++counter const increment = counter => ++counter
登錄后復制

前一個函數每次調用都會修改外部變量的值,返回值也依賴于外部變量;后一個函數對于同一輸入值每次返回的結果都相同,并且不會對外部狀態造成影響。所以后一個是純函數。

為什么要追求函數的純度,這就涉及到一個稱為引用透明性的概念。

4.2.1 引用透明性

純函數的這種函數的返回值只依賴于其輸入值的特性,被稱為引用透明性(referential transparency),純函數都是可以進行緩存的。

const memorize(pureFn) {   const _cache = {}   return (...args) => {     const key = JSON.stringify(args)     return _cache[key] || (_cache[key] = purFu.apply(null, args))   } }
登錄后復制

4.3 Immutable Data

「可變的全局狀態是萬惡之源」(其實從功能代碼的角度看,局部和全局是相對而言的),簡而言之可變狀態會讓程序的運行變得不可預測,代碼可讀性差,難以維護。

在 JS 中,當函數入參是對象類型的數據時,我們拿到的其實是個引用,所以即使在函數內部我們也是可以修改對象內部的屬性,這種情景依然會產生副作用。

所以這個時候就需要引入 Immutable 的概念。 Immutable 即 unchangeable, Immutable data在初始化創建后就不能被修改了,每次對于 Immutable data 的操作都會返回一個新的 Immutable data。 所以并不會對原來的狀態形成改變(當然不是簡單的深拷貝再修改)。

Immutable 比較流行的 JS 實現有 immutable-js 和 seamless-immutable; 對于 React 黨來說, immutable-js 一點都不陌生, immutable-js 配合 Redux 就是一種很好的 FP 實踐。

const map1 = Immutable.Map({a:1, b: {d:2}, c:3}); const map2 = map1.set('a', 50); map1 === map2 // false const mapb1 = map1.get('b') const mapb2 = map2.get('b') mapb1===mapb2 // true
登錄后復制

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲久久一区| 日韩欧美少妇| 不卡视频在线| 亚洲婷婷在线| 国产高清久久| 婷婷成人在线| 亚洲精品国产偷自在线观看| 欧美日韩一区二区综合| 免费不卡中文字幕在线| 欧美日韩水蜜桃| 一区二区视频欧美| 亚洲免费观看| 国产精品社区| 欧美日韩一二三四| 在线看片不卡| 视频一区中文| 亚洲永久字幕| 亚洲人成在线影院| 国产精品一区免费在线| 精品午夜av| 欧美成人a交片免费看| 日韩一区二区三区免费| 黄色亚洲免费| 亚洲精品亚洲人成在线观看| 日韩三区四区| 国产精品草草| 日韩三区免费| 免费日韩精品中文字幕视频在线| 欧美日韩精品免费观看视频完整| 日韩精品一二三| 日韩av中文在线观看| 久久成人高清| 999久久久免费精品国产| 亚洲激情欧美| 国产亚洲字幕| 日韩另类视频| 中文字幕一区二区三区在线视频| 麻豆视频久久| 久久香蕉国产| 婷婷五月色综合香五月| 久久久久观看| 午夜久久福利| 久久精品xxxxx| www在线观看黄色| 亚洲欧美日韩国产一区| 国产精品亚洲综合在线观看| 天堂网av成人| 日韩国产精品久久久久久亚洲| 精品亚洲成人| 石原莉奈一区二区三区在线观看| 国产精品成人国产| 91久久中文| 久久不见久久见国语| 久久天堂成人| 欧美一区免费| 99久久久久国产精品| 亚洲精品无吗| 精品捆绑调教一区二区三区| 中文不卡在线| 三上亚洲一区二区| 免费观看日韩电影| 精品国产成人| 免费在线观看视频一区| 欧美日本精品| 亚洲婷婷免费| 国产精品午夜一区二区三区| 日韩和的一区二在线| 日韩国产一二三区| 99久久久久国产精品| 青青伊人久久| 欧美69视频| 欧美激情aⅴ一区二区三区| 好吊视频一区二区三区四区| 国产三级精品三级在线观看国产| 狠狠色综合网| 福利一区二区| 日韩高清中文字幕一区| 99久久精品费精品国产| 国产免费播放一区二区| 国产精品人人爽人人做我的可爱| 国产aa精品| 欧美欧美黄在线二区| 99在线精品免费视频九九视| 国产精品成久久久久| 日韩二区三区在线观看| 激情视频一区二区三区| 久久不见久久见免费视频7| 综合欧美亚洲| 日韩精品影视| 久久超级碰碰| 日韩av午夜在线观看| 亚洲高清二区| 国产成人黄色| 国产欧美日韩精品高清二区综合区 | 奶水喷射视频一区| 国产精品久久久久久久免费软件| 欧美不卡在线| 久久uomeier| 欧美极品中文字幕| 亚洲久久一区| 国产亚洲精品v| 亚洲午夜黄色| 日本综合字幕| 国产一区福利| 国产精品夜夜夜| 亚洲bt欧美bt精品777| 免费日韩精品中文字幕视频在线| 久久精品国产68国产精品亚洲| 麻豆视频一区| 国产精品中文字幕制服诱惑| 六月婷婷一区| 欧美精品一卡| 久久精品高清| 国产综合色产| 久久久国产精品一区二区中文| 国产suv精品一区| 久久精品免视看国产成人| 久久精品 人人爱| 亚洲精品免费观看| 亚欧洲精品视频在线观看| 日韩在线观看一区二区| 麻豆亚洲精品| 热久久免费视频| 亚洲欧美不卡| 亚洲精品成a人ⅴ香蕉片| 亚洲精品福利| 日韩欧美另类中文字幕| 日本在线成人| 欧美日韩一区二区三区四区在线观看 | 国产精选在线| 国产一区二区精品久| 精品三级av| 精品高清久久| 国产精选在线| 99国产精品一区二区| 色婷婷久久久| 精品在线播放| 一区在线观看| 亚洲综合国产| 日本一区二区三区视频在线看| 欧美偷窥清纯综合图区| 久久av网站| 成人在线观看免费视频| 日韩精品不卡一区二区| 99精品美女| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲电影在线一区二区三区| 美腿丝袜亚洲三区| 国产高清不卡| 欧美特黄视频| 伊人久久一区| 国产福利一区二区精品秒拍| 国产一区二区三区四区| 欧美综合另类| 蜜臀久久99精品久久久久宅男| 日韩国产精品久久久| 久久精品系列| 四虎影视精品| 一区二区高清| 久久不见久久见中文字幕免费 | 国产精品v一区二区三区| 久久久久久夜| 99国产精品视频免费观看一公开| 日本在线成人| 国产精品xx| 国产精品毛片| 国产精品入口久久| 亚洲成av在线| 中文字幕一区二区三区四区久久| 国产精品久久久久av蜜臀| 日韩大片在线观看| 先锋影音国产一区| 国产欧美日韩一级| 亚洲成a人片| 免费久久99精品国产| 国产精品igao视频网网址不卡日韩| 综合日韩av| 亚洲制服欧美另类| 欧美激情另类| 免费看精品久久片| 国产精品不卡| 免费成人av在线播放| 精品亚洲a∨| 亚洲欧美日韩国产一区| 久久超级碰碰| 亚洲一区国产一区| 久久的色偷偷| 亚洲一区国产一区| 精品一区二区三区中文字幕| 欧洲毛片在线视频免费观看| 日韩av不卡一区二区| 久久激情网站| 国产欧美在线| 怡红院精品视频在线观看极品| 国产精品地址| 免费日韩精品中文字幕视频在线| 精品伊人久久| 免费在线观看一区二区三区| 国产夫妻在线| 日韩av在线播放中文字幕|