func3的代碼還可以在抽象一下,console.log的函數(shù)也可以寫到compose函數(shù)中。ramda的哲學(xué)有兩個(gè),1是自動柯理化,就是函數(shù)的參數(shù)可以分步傳入,也可以同時(shí)傳入。分部傳入的參數(shù)用到了閉包的概念。這個(gè)概念不理解透徹,柯理化就沒有辦法理解。恰好柯理化是函數(shù)式編程的核心之一。2是函數(shù)配置在前,參數(shù)最后傳入。像是一個(gè)攪拌器一樣,里面有很多的組件,裝配好之后,就可以往里添加原料了。這個(gè)就配置成了函數(shù)的生產(chǎn)線,一邊輸入?yún)?shù),就可以得到返回結(jié)果。comopse是函數(shù)式組合,這里有高階函數(shù)的定義,Javascript的數(shù)據(jù)類型除了簡單數(shù)據(jù)類型其他的都是對象,對象的特點(diǎn)是可以傳引用賦值的,并且javascript的函數(shù)式是傳名調(diào)用的,func()的形式才會調(diào)用函數(shù),所以函數(shù)表達(dá)式的應(yīng)用可以傳遞給其他的函數(shù),在調(diào)用時(shí)需要使用()關(guān)鍵字。這里仍然有閉包的概念。傳遞進(jìn)compose的函數(shù)組組成了一個(gè)對象數(shù)組,雖有可以使用對象數(shù)組的遍歷方法來逐次調(diào)用函數(shù)。這里數(shù)組嗎?隨意可以用數(shù)組的方向正向調(diào)用,也可以反向調(diào)用。當(dāng)函數(shù)數(shù)組傳遞進(jìn)compose函數(shù)時(shí)就形成閉包了。閉包其實(shí)明白了以后,感覺也沒有什么。很多書介紹閉包的概念感覺不一樣,其實(shí)萬變不離其宗的,只不過閉包的應(yīng)用是在是太廣泛了,隨便用個(gè)例子,不太熟悉的人就蒙了。還有就是閉包的概念基礎(chǔ)有兩個(gè)一個(gè)是js引擎的單事件循環(huán),另一個(gè)是作用域。也不是太好理解。閉包加高階函數(shù)使得javascript的函數(shù)具有了可配置性。可配置性時(shí)函數(shù)式編程和命令式編程的分水嶺??膳渲眯允沟煤瘮?shù)式編程中可以分辨出可變部分和不可變部分。這個(gè)地方是函數(shù)式編程需要思考的地方。filter和map函數(shù),reduce函數(shù)的概念其實(shí)基本一樣。要在理解閉包的基礎(chǔ)上,這個(gè)三個(gè)函數(shù)實(shí)現(xiàn)的源碼。其實(shí)不是很復(fù)雜。鏈?zhǔn)讲僮骺雌饋砗蚦ompose一樣,但是有很大不同.鏈?zhǔn)讲僮骱凸艿啦僮骱苋菀谆煜艿啦僮骱蚦ompose操作方方向不同,完成的操作是一樣的。這里傳遞的數(shù)據(jù)對于類型沒有要求。鏈?zhǔn)讲僮魈岬搅艘粋€(gè)概念叫函子。其實(shí)這個(gè)概念如果你用過jQuery的鏈?zhǔn)讲僮鳎瑢?shí)現(xiàn)的就是函子操作。$(elements)把一個(gè)普通的元素包裝成了jquery對象,別小看這樣,一旦完成,元素不但可以使用jQuery對象的方法,還可以通過this把結(jié)果返回給jQuery對象,后續(xù)的鏈?zhǔn)讲僮骶涂梢猿掷m(xù)對這個(gè)對象進(jìn)行操作。這個(gè)很厲害,所以很多復(fù)雜的數(shù)據(jù)變換操作都可以用鏈?zhǔn)讲僮鱽硗瓿伞?pre>以我的觀點(diǎn),ramda其實(shí)沒有太大難度,難點(diǎn)仍然是閉包的概念,要吃透這個(gè)才行。當(dāng)我第一次腦海中形成了閉包的可配置性這個(gè)概念,似乎一下感覺找到了學(xué)習(xí)javascript的法寶。