《Javascript函數式編程 PDF》javascript
# csdn下載地址
http://download.csdn.net/detail/tssxm/9713727
Underscore css
# github
https://github.com/jashkenas/underscore
# 中文官方網站
http://www.css88.com/doc/underscore/
# CDN
<script src="https://cdn.bootcss.com/underscore.js/1.8.3/underscore-min.js"></script>
理論篇java
什麼是函數式編程?git
「將值轉化成抽象函數」 —— 這是一種簡單的解釋,而且大部分狀況也都遵循這個原則。
什麼是抽象函數?github
抽象函數指的是隱藏了實現細節、隱藏數據和行爲的函數。
這種思路和麪向對象中的「封裝」思路同樣,儘管他們在實踐中是不一樣的。
什麼是Applicative編程? 編程
函數A做爲參數提供給函數B,典型的例子就是UnderScore庫中的_.map,_.reduce和_.filter。
什麼是高階函數? 數組
以一個函數做爲參數,而且返回另外一個函數
爲何要學習函數式編程?app
它能夠幫助咱們簡化本身的庫和應用程序,而且幫助簡化Javascript的複雜度 它使咱們放棄不少舊的思惟習慣,並從一些面向對象的思想中逐漸退出,打造出一種全新的代碼思惟 若是你熟悉面向對象編程,那麼你會贊成它的主要目標是將問題分解成多個部件/對象。但當這些部件/對象被從新彙集組合在一塊兒時,會成爲更大的部件、在一個面向對象系統的內部,咱們會發現對象間的交互會引發各個對象內部狀態的變化,而整個系統的狀態轉變則是由許許多多小的、細微的狀態變化混合造成的。這種無形的「變化網」時不時會由於它而感到困惑。當須要瞭解其帶來的微妙且普遍的狀態變化時,這種困惑就會成爲一個問題。 函數式編程一樣會將一個問題分紅幾個部分(函數)來解決。與面向對象中將問題分解成多組對象不一樣,函數式編程將相同的問題分解成多組函數。與面向對象編程相似的是,函數式編程也經過組合其餘函數的方式來構建更大的函數,以實現更加抽象的行爲。 相比之下,函數式系統努力減小可見的狀態修改。所以,若是說要向一個遵循函數式原則的系統中,添加新的功能,就能夠理解爲: 如何在侷限的上下文環境中,開發新的函數無破壞性的進行數據轉換(原始數據永不發生變化) 然而,函數式編程和麪向對象風格並不該該是對立關係。
函數式編程初試 :一個返回函數的函數ide
全部的javascript函數都有內置一個 apply 方法。
它使得咱們能夠用一個數組做爲參數來執行一個函數。數組的元素會做爲函數的參數。函數式編程
// apply 示例代碼
function splat (func) { return function (array) { return func.apply(null,array); } } var addArrayElements = splat(function(x,y,z){return x + y + z}); addArrayElements([1,2,3]); // 6
另外一個與apply類似的方法:call , 該方法則是直接將參數逐一傳遞給函數
儘管如此,咱們也不可能在使用call時採起這種代碼方式:func.call(null,1,2,3,4,5,6,7...); 這樣實在太冗餘了。(除非傳入的參數只有一、2個那就隨意~)
每一個javascript函數均可以訪問一個名爲 arguments 的局部對象。它會以對象的形式存儲調用本函數時所傳遞的全部參數。
因此,正確的call使用套路應該是:func.call(null,_.toArray(arguments));
事實上,不只call如此,咱們知道apply自己也是接受一個array參數,因此當apply也要使用arguments時,一樣也是這個套路:
func.apply(null,_.toArray(arguments));
// 頁面動態插入underscore類庫的cdn地址 o = document.createElement('script'); o.src = "https://cdn.bootcss.com/underscore.js/1.8.3/underscore-min.js"; document.documentElement.childNodes[0].appendChild(o);
// call 示例代碼 function unsplat (func) { return function () { // 注意 :內置的 arguments 變量本質是一個對象類型,而 join 方法只能對數組使用,不然會報錯。 // 因此須要使用Underscore工具庫的_.toArray方法將其轉化爲數組類型才能夠正常使用,固然你可使用其餘方式轉換. return func.call(null,_.toArray(arguments)); } } var test = unsplat(function(arr){ return arr.join(' '); }); test(1,2,3,4,5,6,7); //"1 2 3 4 5 6 7"
apply 與 call 僅僅只是實現函數式編程的其中一種方法而已。
Underscore 示例
Underscore 提供了一套漂亮實用的函數式風格API。可讓咱們更加輕易的實現函數式編程
在這一章中我會盡量列舉該庫經常使用的方法以及使用示例