JavaScript函數(shù)式編程示例分析
函數(shù)式編程
1.函數(shù)式編程指的是函數(shù)的映射關(guān)系
2.vue3、react16.8的函數(shù)組件推動(dòng)了前端函數(shù)編程
3.必須是純函數(shù)(冪等):同樣的輸入有同樣的輸出
//非純函數(shù) function getFirst1(arr){ return arr.splice(0,1); }; //純函數(shù) function getFirst2(arr){ return arr.slice(0,1); }; const arr = [1,2,3,4,5]; getFirst1(arr);//[1] getFirst1(arr);//[2] getFirst2(arr);//[1] getFirst1(arr);//[1]
再來看一組純函數(shù)和非純函數(shù)的例子
//非存函數(shù) const avaliableVersion = 16.8; function checkVersion(version){ return version >= avaliableVersion; }; //純函數(shù) function checkVersion(version){ return version >= 16.8; };
由于前面的函數(shù)依賴了外部的(環(huán)境)變量,當(dāng)avaliableVersion這個(gè)外部變量發(fā)生變化的時(shí)候輸出結(jié)果也會(huì)變化,將avaliableVersion在函數(shù)內(nèi)部固定寫死就使得這個(gè)函數(shù)成為純函數(shù)了,但是這樣有一個(gè)致命的弊端就是寫出來的代碼不夠靈活沒有拓展性,使用函數(shù)柯理化能有效解決這個(gè)問題。
函數(shù)柯理化(Curring)
柯理化能做到函數(shù)的預(yù)加載
//普通函數(shù) const add = (x,y)=>x+y; //柯理化后 const curringAdd = x => (y=>x+y); const add2 = curringAdd(2); const add3 = curringAdd(3); console.log(add2(1),add3(1));//3,4
函數(shù)柯理化也有一個(gè)弊端就是函數(shù)層層嵌套,像包心菜一樣,于是又出現(xiàn)了compose(組合)用來解決這個(gè)問題。
Compose
const compose = (f1,f2)=>(x=>f1(f2(x))); const add2 = x=> x+2; const mult5 = x=>x*5; const.log(compose(mult5,add2)(2));
場(chǎng)景案例
如何在不知道數(shù)組長度的情況下獲取數(shù)組的最后一個(gè)元素? 這道題的其中一個(gè)解題方法是先把數(shù)組reverse再取值
//常規(guī)寫法 function getFirst(arr){ return arr.reverse()[0]; }; //使用compose 1.倒置數(shù)組 2.取數(shù)組的第一項(xiàng) const reverse = arr => arr.reverse(); const getFirstFromArray = arr => arr[0]; console.log(compose(getFirstFromArray, reverse)([1, 2, 3, 4, 5]));//5,4,3,2,1
總結(jié)
1.必須是純函數(shù)
2.函數(shù)式編程需要結(jié)合Curring和Compose使用
3.函數(shù)編程的優(yōu)點(diǎn)有(1).代碼更穩(wěn)定更獨(dú)立,更有利于單測(cè)和tree shaking.(2).更接近原生js。
到此這篇關(guān)于JavaScript函數(shù)式編程示例分析的文章就介紹到這了,更多相關(guān)JS函數(shù)式編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript詞法作用域與調(diào)用對(duì)象深入理解
關(guān)于 Javascript 的函數(shù)作用域、調(diào)用對(duì)象和閉包之間的關(guān)系很微妙,關(guān)于它們的文章已經(jīng)有很多,本文做了一些總結(jié),需要的朋友可以參考下2012-11-11微信小程序?qū)崿F(xiàn)手勢(shì)滑動(dòng)卡片效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)手勢(shì)滑動(dòng)卡片效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08bootstrap響應(yīng)式導(dǎo)航條模板使用詳解(含下拉菜單,彈出框)
這篇文章主要為大家詳細(xì)介紹了bootstrap響應(yīng)式導(dǎo)航條模板使用詳解,含下拉菜單,彈出框效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11js自定義方法通過隱藏iframe實(shí)現(xiàn)文件下載
通過隱藏iframe實(shí)現(xiàn)文件下載,不可思議吧,但確實(shí)是可以實(shí)現(xiàn)的,不懂的看下代碼,或許可以幫助到你,而且此功能是用js實(shí)現(xiàn)的,感興趣的你可不要錯(cuò)過了哈2013-02-02超實(shí)用的javascript時(shí)間處理總結(jié)
在大家日常開發(fā)中常常會(huì)要對(duì)時(shí)間進(jìn)行處理,以達(dá)到大家想要的效果,所以本文整理了一些javascript常用的時(shí)間處理類,有需要的可以參考借鑒。2016-08-08js實(shí)現(xiàn)盒子滾動(dòng)動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)盒子滾動(dòng)動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08