JavaScript 函數(shù)式編程實踐(來自IBM)
更新時間:2010年06月29日 08:46:44 作者:
說到函數(shù)式編程,人們的第一印象往往是其學(xué)院派,晦澀難懂,大概只有那些蓬頭散發(fā),不修邊幅,甚至有些神經(jīng)質(zhì)的大學(xué)教授們才會用的編程方式。
清單 15. jQuery 選擇器
復(fù)制代碼 代碼如下:
var cons = $("div.note");// 找出所有具有 note 類的 div
var con = $("div#con");// 找出 id 為 con 的 div 元素
var links = $("a");// 找出頁面上所有的鏈接元素
當(dāng)然,jQuery 的選擇器規(guī)則非常豐富,這里要說的是:用 jQuery 選擇器選擇出來的 jQuery 對象本質(zhì)上是一個 List,正如 LISP 語言那樣,所有的函數(shù)都是基于 List 的。
有了這個 List,我們可以做這樣的動作:
清單 16. jQuery 操作 jQuery 對象 (List)
復(fù)制代碼 代碼如下:
cons.each( function (index){
$( this ).click( function (){
//do something with the node
});
});
想當(dāng)與對 cons 這個 List中的所有元素使用 map( 還記得我們前面提到的 map 嗎? ),操作結(jié)果仍然為一個 List。我們可以任意的擴(kuò)大 / 縮小這個列表,比如:
清單 17. 擴(kuò)大 / 縮小 jQuery 集合
復(fù)制代碼 代碼如下:
cons.find("span.title");// 在 div.note 中進(jìn)行更細(xì)的篩選
cons.add("div.warn");// 將 div.note 和 div.warn 合并起來
cons.slice(0, 5);// 獲取 cons 的一個子集
現(xiàn)在我們來看一個小例子,假設(shè)有這樣一個頁面:
清單 18. 頁面的 HTML 結(jié)構(gòu)
復(fù)制代碼 代碼如下:
<div class="note">
<span class="title">Hello, world</span>
</div>
<div class="note">
<span class="title">345</span>
</div>
<div class="note">
<span class="title">Hello, world</span>
</div>
<div class="note">
<span class="title">67</span>
</div>
<div class="note">
<span class="title">483</span>
</div>
效果如下:
圖 1. 過濾之前的效果
我們通過 jQuery 對包裝集進(jìn)行一次過濾,jQuery 的過濾函數(shù)可以使得選擇出來的列表對象只保留符合條件的,在這個例子中,我們保留這樣的 div,當(dāng)且僅當(dāng)這個 div 中包含一個類名為 title 的 span,并且這個 span 的內(nèi)容為數(shù)字:
清單 19. 過濾集合
復(fù)制代碼 代碼如下:
var cons = $("div.note").hide();// 選擇 note 類的 div, 并隱藏
cons.filter( function (){
return $( this ).find("span.title").html().match(/^\d+$/);
}).show();
效果如下圖所示:
圖 2. 過濾之后的效果
我們再來看看 jQuery 中對數(shù)組的操作 ( 本質(zhì)上來講,JavaScript 中的數(shù)組跟 List 是很類似的 ),比如我們在前面的例子中提到的 map 函數(shù),過濾器等:
清單 20. jQuery 對數(shù)組的函數(shù)式操作
復(fù)制代碼 代碼如下:
var mapped = $.map([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
function (n){
return n + 1;
});
var greped = $.grep([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
function (n){
return n % 2 == 0;
});
mapped 將被賦值為 :
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
而 greped 則為:
[2, 4, 6, 8, 10]
我們再來看一個更接近實際的例子:
清單 21. 一個頁面刷新的例子
復(fù)制代碼 代碼如下:
function update(item){
return
function (text){
$("div#"+item).html(text);
}
}
function refresh(url, callback){
var params = {
type : "echo",
data : ""
};
$.ajax({
type:"post",
url:url,
cache: false ,
async: true ,
dataType:"json",
data:params,
success: function (data, status){
callback(data);
},
error: function (err){
alert("error : "+err);
}
});
}
refresh("action.do/op=1", update("content1"));
refresh("action.do/op=2", update("content2"));
refresh("action.do/op=3", update("content3"));
首先聲明一個柯里化的函數(shù) update,這個函數(shù)會將傳入的參數(shù)作為選擇器的 id,并更新這個 div 的內(nèi)容 (innerHTML)。然后聲明一個函數(shù) refresh,refresh 接受兩個參數(shù),第一個參數(shù)為服務(wù)器端的 url,第二個參數(shù)為一個回調(diào)函數(shù),當(dāng)服務(wù)器端成功返回時,調(diào)用該函數(shù)。
然后我們陸續(xù)調(diào)用三次 refresh,每次的 url 和 id 都不同,這樣可以將 content1,content2,conetent3 的內(nèi)容通過異步方式更新。這種模式在實際的編程中相當(dāng)有效,因為關(guān)于如何與服務(wù)器通信,以及如果選取頁面內(nèi)容的部分被很好的抽象成函數(shù),現(xiàn)在我們需要做的就是將 url 和 id 傳遞給 refresh,即可完成需要的動作。函數(shù)式編程在很大程度上降低了這個過程的復(fù)雜性,這正是我們選擇使用該思想的最終原因。
結(jié)束語
實際的應(yīng)用中,不會囿于函數(shù)式或者面向?qū)ο?,通常是兩者混合使用,事實上,很多主流的面向?qū)ο笳Z言都在不斷的完善自己,比如加入一些函數(shù)式編程語言的特征等,JavaScript 中,這兩者得到了良好的結(jié)合,代碼不但可以非常簡單,優(yōu)美,而且更易于調(diào)試。
文中僅僅提到 jQuery 特征的一小部分,如果感興趣,則可以在參考資料中找到更多的鏈接,jQuery 非常的流行,因此你可以找到很多論述如何使用它的文章。
- jQuery官方網(wǎng)站的地址,可以下載到最新的 jQuery 庫。
- JavaScript 中的閉包:一篇優(yōu)秀的關(guān)于 JavaScript 閉包的論述。
- 文中提到的 LISP 之根源的譯文,該文詳細(xì)的描述了 LISP 的其中基本原語,很好的解釋了 LISP 的 可編程性。
- 函數(shù)式編程的基本概念:一篇關(guān)于 JavaScript 函數(shù)式編程的基本概念的文章。
- “JavaScript 框架比較”:在本文中,您將了解如何通過 JavaScript 框架更輕松、更快速地創(chuàng)建具有高度交互性和響應(yīng)性的 Web 站點(diǎn)和 Web 應(yīng)用程序。
- “JavaScript 開發(fā)工具包 ”:本專題為您收集了一些和目前業(yè)界比較流行的 JavaScript 開發(fā)工具包相關(guān)的資源,從初級的入門介紹到高級的使用以及和其他開發(fā)語言、軟件集成的內(nèi)容。
- developerWorks 技術(shù)活動和網(wǎng)絡(luò)廣播:隨時關(guān)注 developerWorks 技術(shù)活動和網(wǎng)絡(luò)廣播。
- developerWorks Web development 專區(qū):通過專門關(guān)于 Web 技術(shù)的文章和教程,擴(kuò)展您在網(wǎng)站開發(fā)方面的技能。
- developerWorks Ajax 資源中心:這是有關(guān) Ajax 編程模型信息的一站式中心,包括很多文檔、教程、論壇、blog、wiki 和新聞。任何 Ajax 的新信息都能在這里找到。
- developerWorks Web 2.0 資源中心,這是有關(guān) Web 2.0 相關(guān)信息的一站式中心,包括大量 Web 2.0 技術(shù)文章、教程、下載和相關(guān)技術(shù)資源。您還可以通過 Web 2.0 新手入門 欄目,迅速了解 Web 2.0 的相關(guān)概念。
您可能感興趣的文章:
- JavaScript繼承基礎(chǔ)講解(原型鏈、借用構(gòu)造函數(shù)、混合模式、原型式繼承、寄生式繼承、寄生組合式繼承)
- 淺談JS繼承_借用構(gòu)造函數(shù) & 組合式繼承
- javascript組合使用構(gòu)造函數(shù)模式和原型模式實例
- JS繼承之借用構(gòu)造函數(shù)繼承和組合繼承
- JavaScript函數(shù)式編程(Functional Programming)箭頭函數(shù)(Arrow functions)用法分析
- JavaScript函數(shù)式編程(Functional Programming)高階函數(shù)(Higher order functions)用法分析
- JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法分析
- JavaScript函數(shù)式編程(Functional Programming)聲明式與命令式實例分析
- 詳解用函數(shù)式編程對JavaScript進(jìn)行斷舍離
- 用函數(shù)式編程技術(shù)編寫優(yōu)美的 JavaScript_ibm
- JavaScript函數(shù)式編程(Functional Programming)組合函數(shù)(Composition)用法分析
相關(guān)文章
js 獲取當(dāng)前web應(yīng)用的上下文路徑實現(xiàn)方法
下面小編就為大家?guī)硪黄猨s 獲取當(dāng)前web應(yīng)用的上下文路徑實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08關(guān)于Javascript作用域鏈的八點(diǎn)總結(jié)
其實吧,關(guān)于作用域鏈相關(guān)的文章我也看了不少,但是我一直也沒能做一個詳細(xì)的總結(jié),今天把我看到的一些東西,結(jié)合自己的想法,總結(jié)成以下8個點(diǎn)2013-12-12JS 組件系列之Bootstrap Table的凍結(jié)列功能徹底解決高度問題
這篇文章主要介紹了JS 組件系列之Bootstrap Table的凍結(jié)列功能徹底解決高度問題,需要的朋友可以參考下2017-06-06javascript替換已有元素replaceChild()使用介紹
這篇文章主要介紹了javascript替換已有元素replaceChild()使用,需要的朋友可以參考下2014-04-0410個基于瀏覽器的JavaScript調(diào)試工具分享
調(diào)試Javascript可能是web開發(fā)中最讓人郁悶的事情,這里是10款我們精選的基于瀏覽器的JS在線調(diào)試工具,感興趣的朋友可以參考下,或許對你有所幫助2013-02-02javascript實現(xiàn)類似于新浪微博搜索框彈出效果的方法
這篇文章主要介紹了javascript實現(xiàn)類似于新浪微博搜索框彈出效果的方法,涉及javascript彈出搜索框的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07