javascript - Underscore 與 函數式編程

《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

「將值轉化成抽象函數」 —— 這是一種簡單的解釋,而且大部分狀況也都遵循這個原則。
View Code

 

什麼是抽象函數?github

抽象函數指的是隱藏了實現細節、隱藏數據和行爲的函數。

這種思路和麪向對象中的「封裝」思路同樣,儘管他們在實踐中是不一樣的。
View Code

 

什麼是Applicative編程? 編程

函數A做爲參數提供給函數B,典型的例子就是UnderScore庫中的_.map,_.reduce和_.filter。
View Code

  

什麼是高階函數? 數組

以一個函數做爲參數,而且返回另外一個函數
View Code

  

爲何要學習函數式編程?app

它能夠幫助咱們簡化本身的庫和應用程序,而且幫助簡化Javascript的複雜度

它使咱們放棄不少舊的思惟習慣,並從一些面向對象的思想中逐漸退出,打造出一種全新的代碼思惟

若是你熟悉面向對象編程,那麼你會贊成它的主要目標是將問題分解成多個部件/對象。但當這些部件/對象被從新彙集組合在一塊兒時,會成爲更大的部件、在一個面向對象系統的內部,咱們會發現對象間的交互會引發各個對象內部狀態的變化,而整個系統的狀態轉變則是由許許多多小的、細微的狀態變化混合造成的。這種無形的「變化網」時不時會由於它而感到困惑。當須要瞭解其帶來的微妙且普遍的狀態變化時,這種困惑就會成爲一個問題。


函數式編程一樣會將一個問題分紅幾個部分(函數)來解決。與面向對象中將問題分解成多組對象不一樣,函數式編程將相同的問題分解成多組函數。與面向對象編程相似的是,函數式編程也經過組合其餘函數的方式來構建更大的函數,以實現更加抽象的行爲。
相比之下,函數式系統努力減小可見的狀態修改。所以,若是說要向一個遵循函數式原則的系統中,添加新的功能,就能夠理解爲:
如何在侷限的上下文環境中,開發新的函數無破壞性的進行數據轉換(原始數據永不發生變化)

然而,函數式編程和麪向對象風格並不該該是對立關係。
View Code

 

 

函數式編程初試 :一個返回函數的函數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。可讓咱們更加輕易的實現函數式編程

在這一章中我會盡量列舉該庫經常使用的方法以及使用示例

相關文章
相關標籤/搜索