天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript 函數(shù)式編程實(shí)踐(來(lái)自IBM)第1/3頁(yè)

函數(shù)式編程簡(jiǎn)介
說(shuō)到函數(shù)式編程,人們的第一印象往往是其學(xué)院派,晦澀難懂,大概只有那些蓬頭散發(fā),不修邊幅,甚至有些神經(jīng)質(zhì)的大學(xué)教授們才會(huì)用的編程方式。這可能在歷史上的某個(gè)階段的確如此,但是近來(lái)函數(shù)式編程已經(jīng)在實(shí)際應(yīng)用中發(fā)揮著巨大作用了,而更有越來(lái)越多的語(yǔ)言不斷的加入諸如 閉包,匿名函數(shù)等的支持,從某種程度上來(lái)講,函數(shù)式編程正在逐步“同化”命令式編程。
函數(shù)式編程思想的源頭可以追溯到 20 世紀(jì) 30 年代,數(shù)學(xué)家阿隆左 . 丘奇在進(jìn)行一項(xiàng)關(guān)于問題的可計(jì)算性的研究,也就是后來(lái)的 lambda 演算。lambda 演算的本質(zhì)為 一切皆函數(shù),函數(shù)可以作為另外一個(gè)函數(shù)的輸出或者 / 和輸入,一系列的函數(shù)使用最終會(huì)形成一個(gè)表達(dá)式鏈,這個(gè)表達(dá)式鏈可以最終求得一個(gè)值,而這個(gè)過(guò)程,即為計(jì)算的本質(zhì)。
然而,這種思想在當(dāng)時(shí)的硬件基礎(chǔ)上很難實(shí)現(xiàn),歷史最終選擇了同丘奇的 lambda 理論平行的另一種數(shù)學(xué)理論:圖靈機(jī)作為計(jì)算理論,而采取另一位科學(xué)家馮 . 諾依曼的計(jì)算機(jī)結(jié)構(gòu),并最終被實(shí)現(xiàn)為硬件。由于第一臺(tái)計(jì)算機(jī)即為馮 . 諾依曼的程序存儲(chǔ)結(jié)構(gòu),因此運(yùn)行在此平臺(tái)的程序也繼承了這種基因,程序設(shè)計(jì)語(yǔ)言如 C/Pascal 等都在一定程度上依賴于此體系。
到了 20 世紀(jì) 50 年代,一位 MIT 的教授 John McCarthy 在馮 . 諾依曼體系的機(jī)器上成功的實(shí)現(xiàn)了 lambda 理論,取名為 LISP(LISt Processor), 至此函數(shù)式編程語(yǔ)言便開始活躍于計(jì)算機(jī)科學(xué)領(lǐng)域。
函數(shù)式編程語(yǔ)言特性
在函數(shù)式編程語(yǔ)言中,函數(shù)是第一類的對(duì)象,也就是說(shuō),函數(shù) 不依賴于任何其他的對(duì)象而可以獨(dú)立存在,而在面向?qū)ο蟮恼Z(yǔ)言中,函數(shù) ( 方法 ) 是依附于對(duì)象的,屬于對(duì)象的一部分。這一點(diǎn) j 決定了函數(shù)在函數(shù)式語(yǔ)言中的一些特別的性質(zhì),比如作為傳出 / 傳入?yún)?shù),作為一個(gè)普通的變量等。
區(qū)別于命令式編程語(yǔ)言,函數(shù)式編程語(yǔ)言具有一些專用的概念,我們分別進(jìn)行討論:
匿名函數(shù)
在函數(shù)式編程語(yǔ)言中,函數(shù)是可以沒有名字的,匿名函數(shù)通常表示:“可以完成某件事的一塊代碼”。這種表達(dá)在很多場(chǎng)合是有用的,因?yàn)槲覀冇袝r(shí)需要用函數(shù)完成某件事,但是這個(gè)函數(shù)可能只是臨時(shí)性的,那就沒有理由專門為其生成一個(gè)頂層的函數(shù)對(duì)象。比如:

清單 1. map 函數(shù)
復(fù)制代碼 代碼如下:
function map(array, func){
var res = [];
for ( var i = 0, len = array.length; i < len; i++){
res.push(func(array[i]));
}
return res;
}
var mapped = map([1, 3, 5, 7, 8], function (n){
return n = n + 1;
});
print(mapped);
運(yùn)行這段代碼,將會(huì)打印:
2,4,6,8,9// 對(duì)數(shù)組 [1,3,5,7,8] 中每一個(gè)元素加 1

注意 map 函數(shù)的調(diào)用,map 的第二個(gè)參數(shù)為一個(gè)函數(shù),這個(gè)函數(shù)對(duì) map 的第一個(gè)參數(shù) ( 數(shù)組 ) 中的每一個(gè)都有作用,但是對(duì)于 map 之外的代碼可能沒有任何意義,因此,我們無(wú)需為其專門定義一個(gè)函數(shù),匿名函數(shù)已經(jīng)足夠。
柯里化
柯里化是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。這句話有點(diǎn)繞口,我們可以通過(guò)例子來(lái)幫助理解:
清單 2. 柯里化函數(shù)
復(fù)制代碼 代碼如下:
function adder(num){
return
function (x){
return num + x;
}
}
var add5 = adder(5);
var add6 = adder(6);
print(add5(1));
print(add6(1));

結(jié)果為:
6
7
比較有意思的是:函數(shù) adder 接受一個(gè)參數(shù),并返回一個(gè)函數(shù),這個(gè)返回的函數(shù)可以被預(yù)期的那樣被調(diào)用。變量 add5 保持著 adder(5) 返回的函數(shù),這個(gè)函數(shù)可以接受一個(gè)參數(shù),并返回參數(shù)與 5 的和。
柯里化在 DOM 的回調(diào)中非常有用,我們將在下面的小節(jié)中看到。
高階函數(shù)
高階函數(shù)即為對(duì)函數(shù)的進(jìn)一步抽象,事實(shí)上,我們?cè)谀涿瘮?shù)小節(jié)提到的 map 函數(shù)即為一種高階函數(shù),在很多的函數(shù)式編程語(yǔ)言中均有此函數(shù)。map(array, func) 的表達(dá)式已經(jīng)表明,將 func 函數(shù)作用于 array 中的每一個(gè)元素,最終返回一個(gè)新的 array,應(yīng)該注意的是,map 對(duì) array 和 func 的實(shí)現(xiàn)是沒有任何預(yù)先的假設(shè)的,因此稱之為“高階”函數(shù):

清單 3. 高階函數(shù)
復(fù)制代碼 代碼如下:
function map(array, func){
var res = [];
for ( var i = 0, len = array.length; i < len; i++){
res.push(func(array[i]));
}
return res;
}
var mapped = map([1, 3, 5, 7, 8], function (n){
return n = n + 1;
});
print(mapped);
var mapped2 = map(["one", "two", "three", "four"],
function (item){
return "("+item+")";
});
print(mapped2);


將會(huì)打印如下結(jié)果:
2,4,6,8,9
(one),(two),(three),(four)// 為數(shù)組中的每個(gè)字符串加上括號(hào)

mapped 和 mapped2 均調(diào)用了 map,但是得到了截然不同的結(jié)果,因?yàn)?map 的參數(shù)本身已經(jīng)進(jìn)行了一次抽象,map 函數(shù)做的是第二次抽象,高階的“階”可以理解為抽象的層次。
JavaScript 中的函數(shù)式編程
JavaScript 是一門被誤解甚深的語(yǔ)言,由于早期的 Web 開發(fā)中,充滿了大量的 copy-paste 代碼,因此平時(shí)可以見到的 JavaScript 代碼質(zhì)量多半不高,而且 JavaScript 代碼總是很飛動(dòng)的不斷閃爍的 gif 廣告,限制網(wǎng)頁(yè)內(nèi)容的復(fù)制等聯(lián)系在一起的,因此包括 Web 開發(fā)者在內(nèi)的很多人根本不愿意去學(xué)習(xí) JavaScript。
這種情形在 Ajax 復(fù)興時(shí)得到了徹底的扭轉(zhuǎn),Google Map,Gmail 等 Ajax 應(yīng)用的出現(xiàn)使人們驚嘆:原來(lái) JavaScript 還可以做這樣的事!很快,大量?jī)?yōu)秀的 JavaScript/Ajax 框架不斷出現(xiàn),比如 Dojo,Prototype,jQuery,ExtJS 等等。這些代碼在給頁(yè)面帶來(lái)絢麗的效果的同時(shí),也讓開發(fā)者看到函數(shù)式語(yǔ)言代碼的優(yōu)雅。
函數(shù)式編程風(fēng)格
JavaScript 中,函數(shù)本身為一種特殊對(duì)象,屬于頂層對(duì)象,不依賴于任何其他的對(duì)象而存在,因此可以將函數(shù)作為傳出 / 傳入?yún)?shù),可以存儲(chǔ)在變量中,以及一切其他對(duì)象可以做的事情 ( 因?yàn)楹瘮?shù)就是對(duì)象 )。
JavaScript 被稱為有著 C 語(yǔ)法的 LISP,LISP 代碼的一個(gè)顯著的特點(diǎn)是大量的括號(hào)以及前置的函數(shù)名,比如:

清單 4. LISP 中的加法
(+ 1 3 4 5 6 7)

加號(hào)在 LISP 中為一個(gè)函數(shù),這條表達(dá)式的意思為將加號(hào)后邊的所有數(shù)字加起來(lái),并將值返回,JavaScript 可以定義同樣的求和函數(shù):

清單 5. JavaScript 中的求和
復(fù)制代碼 代碼如下:
function sum(){
var res = 0;
for ( var i = 0, len = arguments.length; i < len; i++){
res += parseInt(arguments[i]);
}
return res;
}
print(sum(1,2,3));
print(sum(1,2,3,4,6,7,8));

運(yùn)行此段代碼,得到如下結(jié)果:
6
31

如果要完全模擬函數(shù)式編碼的風(fēng)格,我們可以定義一些諸如:

清單 6. 一些簡(jiǎn)單的函數(shù)抽象
復(fù)制代碼 代碼如下:
function add(a, b){ return a+b; }
function sub(a, b){ return a-b; }
function mul(a, b){ return a*b; }
function div(a, b){ return a/b; }
function rem(a, b){ return a%b; }
function inc(x){ return x + 1; }
function dec(x){ return x - 1; }
function equal(a, b){ return a==b; }
function great(a, b){ return a>b; }
function less(a, b){ return a<b; }

這樣的小函數(shù)以及謂詞,那樣我們寫出的代碼就更容易被有函數(shù)式編程經(jīng)驗(yàn)的人所接受:

JavaScript技術(shù)JavaScript 函數(shù)式編程實(shí)踐(來(lái)自IBM)第1/3頁(yè),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 少妇无码吹潮久久精品AV网站 | 2021精品国产综合久久 | 国内精品国内自产视频 | 欧美成人精品高清在线观看 | 久久精品一区二区免费看 | 99视频免费看 | 无码中文字幕热热久久 | 久久久久激情免费观看 | 人体内射精一区二区三区 | 午夜男女爽爽羞羞影院在线观看 | 人妻中文字幕乱人伦在线 | 亚洲欧美另类无码专区 | 大桥未久电影在线观看 | 亚洲一区自拍高清亚洲精品 | 久久精品九九亚洲精品天堂 | 在线高清无码欧美久章草 | 国产亚洲欧美在线中文BT天堂网 | 亚洲国产精品嫩草影院永久 | 好姑娘BD高清在线观看免费 | 一个人HD高清在线观看免费视频 | 国产成人免费a在线视频app | 久久国产乱子伦免费精品 | 午夜宅宅伦电影网中文字幕 | 99久久爱re热6在线播放 | 亚洲精品午夜久久久伊人 | x8国产精品视频 | 麻豆精品人妻一区二区三区蜜桃 | 丰满老熟女白浆直流 | 欧美含羞草免费观看全部完 | 蜜桃传媒一区二区亚洲AV | 秋霞网韩国理伦片免费看 | 秋霞伦理机在线看片 | 影音先锋男人av橹橹色 | 琪琪热热色原日韩在线 | 四虎成人影院 | 在线亚洲精品国产一区麻豆 | 精品久久久久久久99热 | 无码国产色欲XXXX视频 | 好男人免费观看在线高清WWW | 伊人久99久女女视频精品免 | 蜜臀AV精品久久无码99 |