最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用函數(shù)式編程技術(shù)編寫優(yōu)美的 JavaScript_ibm

 更新時(shí)間:2008年05月16日 22:26:35   作者:  
函數(shù)式編程語言在學(xué)術(shù)領(lǐng)域已經(jīng)存在相當(dāng)長一段時(shí)間了,但是從歷史上看,它們沒有豐富的工具和庫可供使用。隨著 .NET 平臺(tái)上的 Haskell 的出現(xiàn),函數(shù)式編程變得更加流行。一些傳統(tǒng)的編程語言,例如 C++ 和 JavaScript,引入了由函數(shù)式編程提供的一些構(gòu)造和特性。在許多情況下,JavaScript 的重復(fù)代碼導(dǎo)致了一些拙劣的編碼。如果使用函數(shù)式編程,就可以避免這些問題。此外,可以利用函數(shù)式編程風(fēng)格編寫更加優(yōu)美的回調(diào)。
因?yàn)楹瘮?shù)式編程采用了完全不同的組織程序的方式,所以那些習(xí)慣于采用命令式范例的程序員可能會(huì)發(fā)現(xiàn)函數(shù)式編程有點(diǎn)難學(xué)。在這篇文章中,您將了解一些關(guān)于如何采用函數(shù)式風(fēng)格,用 JavaScript 編寫良好的、優(yōu)美的代碼的示例。我將討論: 

函數(shù)式編程概念,包括匿名函數(shù)、調(diào)用函數(shù)的不同方法,以及將函數(shù)作為參數(shù)傳遞給其他函數(shù)的方式。

函數(shù)式概念的運(yùn)用,采用的示例包括:擴(kuò)展數(shù)組排序;動(dòng)態(tài) HTML 生成的優(yōu)美代碼;系列函數(shù)的應(yīng)用。 
函數(shù)式編程概念

 請(qǐng)告訴每個(gè)人。請(qǐng)把這個(gè)提交給:

  
  Digg  

  Slashdot  

 

在那些通過描述 “如何做” 指定解決問題的方法的語言中,許多開發(fā)人員都知道如何進(jìn)行編碼。例如,要編寫一個(gè)計(jì)算階乘的函數(shù),我可以編寫一個(gè)循環(huán)來描述程序,或者使用遞歸來查找所有數(shù)字的乘積。在這兩種情況下,計(jì)算的過程都在程序中進(jìn)行了詳細(xì)說明。清單 1 顯示了一個(gè)計(jì)算階乘的可能使用的 C 代碼。


清單 1. 過程風(fēng)格的階乘

int factorial (int n)
{
  if (n <= 0)
    return 1;
  else
    return n * factorial (n-1);
}



這類語言也叫做過程性 編程語言,因?yàn)樗鼈兌x了解決問題的過程。函數(shù)式編程與這個(gè)原理有顯著不同。在函數(shù)式編程中,需要描述問題 “是什么”。 函數(shù)式編程語言又叫做聲明性 語言。同樣的計(jì)算階乘的程序可以寫成所有到 n 的數(shù)字的乘積。計(jì)算階乘的典型函數(shù)式程序看起來如 清單 2 中的示例所示。


清單 2. 函數(shù)式風(fēng)格的階乘

factorial n, where n <= 0     := 1
factorial n    := foldr * 1 take n [1..]



第二個(gè)語句指明要得到從 1 開始的前 n 個(gè)數(shù)字的列表(take n [1..]),然后找出它們的乘積,1 為基元。這個(gè)定義與前面的示例不同,沒有循環(huán)或遞歸。它就像階乘函數(shù)的算術(shù)定義。一旦了解了庫函數(shù)(take 和 foldr)和標(biāo)記(list notation [ ])的意義,編寫代碼就很容易,而且可讀性也很好。

 只用三行 Miranda 代碼就可以編寫例程,根據(jù)參數(shù),使用廣度優(yōu)先或深度優(yōu)先遍歷處理 n 叉樹的每個(gè)節(jié)點(diǎn),而且元素可以是任何通用類型。  

從歷史上看,函數(shù)式編程語言不太流行有各種原因。但是最近,有些函數(shù)式編程語言正在進(jìn)入計(jì)算機(jī)行業(yè)。其中一個(gè)例子就是 .NET 平臺(tái)上的 Haskell。其他情況下,現(xiàn)有的一些語言借用了函數(shù)式編程語言中的一些概念。一些 C++ 實(shí)現(xiàn)中的迭代器和 continuation,以及 JavaScript 中提供的一些函數(shù)式構(gòu)造(functional construct),就是這種借用的示例。但是,通過借用函數(shù)式構(gòu)造,總的語言編程范例并沒有發(fā)生變化。JavaScript 并沒因?yàn)楹瘮?shù)式構(gòu)造的添加就變成了函數(shù)式編程語言。

我現(xiàn)在要討論 JavaScript 中的函數(shù)式構(gòu)造的各種美妙之處,以及在日常編碼和工作中使用它們的方式。我們將從一些基本功能開始,然后用它們查看一些更有趣的應(yīng)用。

匿名函數(shù)

在 JavaScript 中,可以編寫匿名函數(shù)或沒有名稱的函數(shù)。為什么需要這樣的函數(shù)?請(qǐng)繼續(xù)往下讀,但首先我們將學(xué)習(xí)如何編寫這樣一個(gè)函數(shù)。如果擁有以下 JavaScript 函數(shù): 
清單 3. 典型的函數(shù)

function sum(x,y,z) {
  return (x+y+z);
}




然后對(duì)應(yīng)的匿名函數(shù)看起來應(yīng)當(dāng)如下所示: 
清單 4. 匿名函數(shù)

function(x,y,z) {
  return (x+y+z);
}




要使用它,則需要編寫以下代碼:


清單 5. 應(yīng)用匿名函數(shù)

var sum = function(x,y,z) {
  return (x+y+z);
}(1,2,3);
alert(sum);



使用函數(shù)作為值

也可以將函數(shù)作為值使用。還可以擁有一些所賦值是函數(shù)的變量。在最后一個(gè)示例中,還可以執(zhí)行以下操作: 
清單 6. 使用函數(shù)賦值

var sum = function(x,y,z) {
  return (x+y+z);
}
alert(sum(1,2,3));




在上面 清單 6 的示例中,為變量 sum 賦的值是函數(shù)定義本身。這樣,sum 就成了一個(gè)函數(shù),可以在任何地方調(diào)用。

調(diào)用函數(shù)的不同方法

JavaScript 允許用兩種方式調(diào)用函數(shù),如清單 7 和 8 所示。 


清單 7. 典型的函數(shù)應(yīng)用

alert (“Hello, World!");






清單 8. 用函數(shù)作為表達(dá)式

(alert) (“Hello, World!");



所以也可以編寫以下代碼:


清單 9. 定義函數(shù)之后就可以立即使用它

( function(x,y,z) { return (x+y+z) } ) (1, 2, 3);



可以在括號(hào)中編寫函數(shù)表達(dá)式,然后傳遞給參數(shù),對(duì)參數(shù)進(jìn)行運(yùn)算。雖然在 清單 8 的示例中,有直接包含在括號(hào)中的函數(shù)名稱,但是按 清單 9 中所示方式使用它時(shí),就不是這樣了。

將函數(shù)作為參數(shù)傳遞給其他函數(shù)

也可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)。雖然這不是什么新概念,但是在后續(xù)的示例中大量的使用了這個(gè)概念??梢詡鬟f函數(shù)參數(shù),如 清單 10 所示。


清單 10. 將函數(shù)作為參數(shù)傳遞,并應(yīng)用該函數(shù)

var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };

var sum = function(x,y,z) {
  return x+y+z;
};

alert( passFunAndApply(sum,3,4,5) ); // 12



執(zhí)行最后一個(gè) alert 語句輸出了一個(gè)大小為 12 的值。

使用函數(shù)式概念

前一節(jié)介紹了一些使用函數(shù)式風(fēng)格的編程概念。所給的示例并沒有包含所有的概念,它們?cè)谥匾苑矫嬉矝]有先后順序,只是一些與這個(gè)討論有關(guān)的概念而已。下面對(duì) JavaScript 中的函數(shù)式風(fēng)格作一快速總結(jié): 

函數(shù)并不總是需要名稱。 
函數(shù)可以像其他值一樣分配給變量。 
函數(shù)表達(dá)式可以編寫并放在括號(hào)中,留待以后應(yīng)用。 
函數(shù)可以作為參數(shù)傳遞給其他函數(shù)。 

這一節(jié)將介紹一些有效使用這些概念編寫優(yōu)美的 JavaScript 代碼的示例。(使用 JavaScript 函數(shù)式風(fēng)格,可以做許多超出這個(gè)討論范圍的事。)

擴(kuò)展數(shù)組排序 
先來編寫一個(gè)排序方法,可以根據(jù)數(shù)組元素的日期對(duì)數(shù)據(jù)進(jìn)行排序。用 JavaScript 編寫這個(gè)方法非常簡(jiǎn)單。數(shù)據(jù)對(duì)象的排序方法接受一個(gè)可選參數(shù),這個(gè)可選參數(shù)就是比較函數(shù)。在這里,需要使用 清單 11 中的比較函數(shù)。

清單 11. 比較函數(shù)

function (x,y) {
    return x.date – y.date;
}




要得到需要的函數(shù),請(qǐng)使用 清單 12 的示例。


清單 12. 排序函數(shù)的擴(kuò)展

arr.sort( function (x,y) {    return x.date – y.date; } );



其中 arr 是類型數(shù)組對(duì)象。排序函數(shù)會(huì)根據(jù) arr 數(shù)組中對(duì)象的日期對(duì)所有對(duì)象進(jìn)行排序。比較函數(shù)和它的定義一起被傳遞給排序函數(shù),以完成排序操作。使用這個(gè)函數(shù): 

每個(gè) JavaScript 對(duì)象都有一個(gè) date 屬性。 
JavaScript 的數(shù)組類型的排序函數(shù)接受可選參數(shù),可選參數(shù)是用來排序的比較函數(shù)。這與 C 庫中的 qsort 函數(shù)類似。 

動(dòng)態(tài)生成 HTML 的優(yōu)美代碼 
在這個(gè)示例中,將看到如何編寫優(yōu)美的代碼,從數(shù)組動(dòng)態(tài)地生成 HTML??梢愿鶕?jù)從數(shù)據(jù)中得到的值生成表格。或者,也可以用數(shù)組的內(nèi)容生成排序和未排序的列表。也可以生成垂直或水平的菜單項(xiàng)目。 
清單 13 中的代碼風(fēng)格通常被用來從數(shù)組生成動(dòng)態(tài) HTML。


清單 13. 生成動(dòng)態(tài) HTML 的普通代碼

var str=' ';
for (var i=0;i<arr.length;i++) {
  var element=arr[i];
  str+=... HTML generation code...
}
document.write(str);



可以用 清單 14 的代碼替換這個(gè)代碼。


清單 14. 生成動(dòng)態(tài) HTML 的通用方式

Array.prototype.fold=function(templateFn) {
  var len=this.length;
  var str=' ';
  for (var i=0 ; i<len ; i++) 
    str+=templateFn(this[i]);
  return str;
}

function templateInstance(element) {
  return ... HTML generation code ...
}

document.write(arr.fold(templateInstance));



我使用 Array 類型的 prototype 屬性定義新函數(shù) fold。現(xiàn)在可以在后面定義的任何數(shù)組中使用該函數(shù)。

系列函數(shù)的應(yīng)用 
考慮以下這種情況:想用一組函數(shù)作為回調(diào)函數(shù)。為實(shí)現(xiàn)這一目的,將使用 window.setTimeout 函數(shù),該函數(shù)有兩個(gè)參數(shù)。第一個(gè)參數(shù)是在第二個(gè)參數(shù)表示的毫秒數(shù)之后被調(diào)用的函數(shù)。清單 15 顯示了完成此操作的一種方法。 
清單 15. 在回調(diào)中調(diào)用一組函數(shù)

window.setTimeout(function(){alert(‘First!');alert(‘Second!');}, 5000);



清單 16 顯示了完成此操作的更好的方式。


清單 16. 調(diào)用系列函數(shù)的更好的方式

Function.prototype.sequence=function(g) {
  var f=this;
  return function() {
    f();g();
  }
};
function alertFrst() { alert(‘First!'); }
function alertSec() { alert(‘Second!'); }
setTimeout( alertFrst.sequence(alertSec), 5000);



在處理事件時(shí),如果想在調(diào)用完一個(gè)回調(diào)之后再調(diào)用一個(gè)回調(diào),也可以使用 清單 16 中的代碼擴(kuò)展。這可能是一個(gè)需要您自行完成的一個(gè)練習(xí),現(xiàn)在您的興趣被點(diǎn)燃了吧。



 


 回頁首 




結(jié)束語

在許多領(lǐng)域中都可以應(yīng)用 JavaScript 中的函數(shù)式編程,以優(yōu)美的方式完成日?;顒?dòng)。這篇文章中的示例只介紹了幾種情況。如果您找到了函數(shù)式編程的合適場(chǎng)景,并應(yīng)用這些概念,那么您就會(huì)有更多的理解,并且可以增加您的優(yōu)美程度。
更多來自

相關(guān)文章

  • js substr支持中文截取函數(shù)代碼(中文是雙字節(jié))

    js substr支持中文截取函數(shù)代碼(中文是雙字節(jié))

    js substr支持中文截取函數(shù)代碼,中文是雙字節(jié),配有實(shí)例需要的朋友可以參考下
    2013-04-04
  • angular-tree-component的使用詳解

    angular-tree-component的使用詳解

    這篇文章主要介紹了angular-tree-component的使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • javascript面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)踐常用知識(shí)點(diǎn)總結(jié)

    javascript面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)踐常用知識(shí)點(diǎn)總結(jié)

    這篇文章主要介紹了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)踐常用知識(shí)點(diǎn),結(jié)合實(shí)例形式總結(jié)分析了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)中原型引用類型、屬性、方法相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • 如何處理JSON中的特殊字符

    如何處理JSON中的特殊字符

    這篇文章主要介紹了如何處理JSON中的特殊字符,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • console.log的輸出語句如何使用

    console.log的輸出語句如何使用

    這篇文章主要介紹了關(guān)于console.log的輸出語句如何使用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 用按鈕控制iframe顯示的網(wǎng)頁實(shí)現(xiàn)方法

    用按鈕控制iframe顯示的網(wǎng)頁實(shí)現(xiàn)方法

    在iframe中顯示的網(wǎng)頁已經(jīng)是一件平凡無奇的事了,不過可能依然有很多的童鞋沒不知所措吧,沒關(guān)系,因?yàn)楸疚牡某霈F(xiàn)將會(huì)帶你脫離苦海,感性的朋友可以了解下啊,或許對(duì)你有所幫助
    2013-02-02
  • 深入理解JavaScript強(qiáng)制類型轉(zhuǎn)換

    深入理解JavaScript強(qiáng)制類型轉(zhuǎn)換

    JavaScript中的強(qiáng)制類型轉(zhuǎn)換包括顯式和隱式轉(zhuǎn)換,涉及字符串、數(shù)字和布爾值三種基本類型,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • 封裝了一個(gè)支持匿名函數(shù)的Javascript事件監(jiān)聽器

    封裝了一個(gè)支持匿名函數(shù)的Javascript事件監(jiān)聽器

    這篇文章主要介紹了支持匿名函數(shù)的Javascript事件監(jiān)聽封裝,需要的朋友可以參考下
    2014-06-06
  • JavaScript獲取頁面中超鏈接數(shù)量的方法

    JavaScript獲取頁面中超鏈接數(shù)量的方法

    這篇文章主要介紹了JavaScript獲取頁面中超鏈接數(shù)量的方法,涉及JavaScript針對(duì)頁面元素獲取及運(yùn)算的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • TypeScript學(xué)習(xí)筆記之類型窄化篇

    TypeScript學(xué)習(xí)筆記之類型窄化篇

    目前用TypeScript的人越來越多,尤其是一些大廠,大的項(xiàng)目,github上面很多開源項(xiàng)目也都是ts語法編譯的,這篇文章主要給大家介紹了關(guān)于TypeScript學(xué)習(xí)筆記之類型窄化的相關(guān)資料,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

徐汇区| 闻喜县| 蓬溪县| 南开区| 福建省| 肇东市| 延长县| 田林县| 盐山县| 中西区| 兰考县| 疏勒县| 内黄县| 舟曲县| 延边| 远安县| 前郭尔| 福建省| 钟山县| 斗六市| 宜阳县| 龙陵县| 盐城市| 株洲市| 北碚区| 东丽区| 司法| 肇东市| 福州市| 芜湖县| 鄂州市| 涟源市| 南澳县| 汶上县| 湘阴县| 南通市| 西青区| 那坡县| 怀宁县| 连南| 临湘市|