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

比較不錯的函數(shù)式JavaScript編程指南教程

 更新時間:2008年05月16日 22:33:15   作者:  
你是否知道JavaScript其實也是一個函數(shù)式編程語言呢?本指南將教你如何利用JavaScript的函數(shù)式特性。

你是否知道JavaScript其實也是一個函數(shù)式編程語言呢?本指南將教你如何利用JavaScript的函數(shù)式特性。

要求:你應(yīng)當(dāng)已經(jīng)對JavaScript和DOM有了一個基本的了解。

寫這篇指南的目的是因為關(guān)于JavaScript編程的資料太多了但是極少的資料提到了JavaScript的函數(shù)式特性。在本指南中,我只會講解這些基本知識而不會深入其它的函數(shù)式語言或這是Lambda算子。

你可以點擊所有的例子然后你所看到的代碼就會被執(zhí)行,這樣就可以令指南變得具有交互性。你也可以使用這個沙箱來嘗試。

第一課 —— 匿名函數(shù)

我們將首先介紹匿名函數(shù)。一個匿名函數(shù)就是一個沒有名字的函數(shù)。
你可以認(rèn)為他們是一次性函數(shù)。當(dāng)你只需要用一次某個函數(shù)式,他們就特別有用。通過使用匿名函數(shù),沒有必要把函數(shù)一直放在內(nèi)存中,所以使用匿名函數(shù)更加有效率。

例Example:

下面兩個函數(shù)處理同樣的事情,而average在給z賦值結(jié)束之后一直保留——但匿名函數(shù)則不會。

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

這很自然得引出了我們下面的一節(jié)課函數(shù)作為值。

第二課 - 函數(shù)作為值

事實上,我們一般在JavaScript中聲明函數(shù)的方式可以看作是一個簡化了的語法(也就是語法糖,syntactic sugar)。

例:

下面兩個表達式其實完全一樣。所以左邊的表達式僅僅是右邊的簡寫。
function average(x,y) { 
 return (x+y)/2; 
} 
alert( average(1,3) ); 
var average = function(x,y) { 
 return (x+y)/2; 
} 
alert( average(1,3) ); 

從這里可以得出一個結(jié)論,函數(shù)是一個值就像字符串、數(shù)字或數(shù)組一樣。這還出現(xiàn)幾個問題:

我是否可以把函數(shù)作為參數(shù)傳遞?
可以,見下面的例子。
是否可以實時生成函數(shù)?
當(dāng)然了,這是一個高級的主題,它可以通過eval函數(shù)來完成。小提示:看看本頁面的源代碼。

例:

這個例子演示了如何把函數(shù)作為參數(shù)傳遞。

var applyFun = function (f,x,y) { return f(x,y); }; 

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

alert( applyFun(add,3,4) ); // 7 

第三課 - 兩種方式調(diào)用函數(shù)

在JavaScript中,有兩種調(diào)用函數(shù)的方式。一般的方式是把參數(shù)放在括號中,如alert(42)。另一種方式是同時把函數(shù)和參數(shù)都放在括號中,如(alert)(42)

例:

alert(42); 

(alert) (42); 
(function(x) { alert(x-13); }) (55); 

為什么函數(shù)兩邊的括號很重要:如果你寫了括號,那么在括號中的代碼就會被先計算。在計算之后,括號所在的地方就會有一個值。這個值可能是一個字符串、一個數(shù)字或一個函數(shù)。

第四課 - “短路”條件調(diào)用

現(xiàn)在我們將學(xué)習(xí)如何使用“短路”條件調(diào)用。使用這個方法可以縮短源代碼同時代碼也變得更加可讀。

例:

這個語法并不是用在左表達式上,而是用在右表達式上。

var f = false; var t = true;var z; 
if(f) 
 z = 4; 
else if(t) 
 z = 2; 
alert(z); 

var f = false; var t = true; 
var z = (f && 4) || (t && 2); 
alert(z); 

第五課 - 它好在哪里

OK,現(xiàn)在我們已經(jīng)學(xué)習(xí)了一些函數(shù)式JavaScript的內(nèi)容。那么它好在哪里?函數(shù)式JavaScript編程之所以很重要有三條主要的理由:
  1. 它有助于寫出模塊化和可服用的代碼。
  2. 它對事件處理程序非常有效。
  3. 它很有趣!
在下面的篇幅中,我會給出更多關(guān)于前兩條理由的信息

1. 模塊化和可復(fù)用的代碼

現(xiàn)在你已經(jīng)知道如何將函數(shù)作為值使用,那么你也應(yīng)該試試!一個很好的例子是數(shù)組內(nèi)建的sort方法。預(yù)定義的sort()把所有的對象轉(zhuǎn)換成字符串并把他們按照詞語的順序排序。但如果我們有用戶自定義的對象或者數(shù)字那么它就不是很有用了。于是這個函數(shù)可以讓你給他一個進行比較的函數(shù)作為參數(shù),如sort(compareFunction)。這個方法讓我們甚至不用接觸實際的sort方法。

例:

var myarray = new Array(6,7,9,1,-1); 
var sortAsc = function(x,y) { return x-y; }; 
var sortDesc = function(x,y) { return y-x; }; 
myarray.sort(sortDesc); 
alert(myarray); 

myarray.sort(sortAsc); 
alert(myarray); 

2. 事件處理程序

對事件處理程序使用函數(shù)式編程也許是最直觀的函數(shù)作為值得應(yīng)用了。既然這樣我們馬上就演示一個例子。

簡單的例子:;ie

現(xiàn)在有一個Button類,帶一個自定義的onclick行為。

function Button(clickFunction) { 
  this.button = document.createElement("button"); 
  this.button.appendChild(document.createTextNode("Press me!")); 
  this.button.onclick = clickFunction; 
} 
var bt = new Button(function() { alert("42"); }); 

練習(xí): 為什么我們要把alert包裹在一個匿名函數(shù)中?

高級例子:

現(xiàn)在我們想改進我們的Button類。每一個按鈕都被分配了一個值當(dāng)按鈕被點擊時顯示該值。首先我們調(diào)整我們的類:

function Button(value) { 
  this.value = value; 
  this.button = document.createElement("button"); 
  this.button.appendChild(document.createTextNode("test")); 
} 

下面你也許要嘗試寫下面的代碼:

 
this.button.onclick = function() { alert(this.value); }; 

如果你執(zhí)行它你就會發(fā)現(xiàn)提示框中間是空的。為什么會這樣呢?其實原因在于JavaScript的可見性規(guī)則。當(dāng)onclick函數(shù)被執(zhí)行時this指向的是按鈕的DOM節(jié)點而非自定義的按鈕對象。

我們?nèi)绾谓鉀Q這個問題? 使用函數(shù)式編程:

this.button.onclick = (function(v) { 
      return function() { alert(v); }; 
      }) (this.value); 

這種情況下執(zhí)行該匿名函數(shù)會將v綁定到this.value上。

沙箱

在此處輸入你的代碼,并按下計算.

更多信息

下面是關(guān)于函數(shù)式JavaScript編程的一些有趣的鏈接:

  • w3future.com - 針對事件處理函數(shù)和回調(diào)函數(shù)的函數(shù)式編程
  • svendtofte.com - 實用的(& 函數(shù)式的)JavaScript代碼片斷
  • svendtofte.com - 極好的JavaScript庫(包括map, fold, …)
  • CodingForums - 關(guān)于使用Lambda算子的函數(shù)式JavaScript的一篇更加理論性的文章
  • Lambda tutorial - 關(guān)于在JavaScript中編碼Lambda算子的教程
  • The Little JavaScripter - 關(guān)于 Scheme 和 JavaScript 之間的比較

展望

本節(jié)給大家展示一下JavaScript的未來。一個非常振奮人心的JavaScript特性——E4X,一個JavaScript中直接的XML支持。

  • Wikipedia on E4X - 關(guān)于 E4X 的很好的介紹
  • Mozilla E4X - Brandon Eich (Mozilla首席架構(gòu)師)關(guān)于E4X的演示

相關(guān)文章

  • js判斷ie版本號的簡單實現(xiàn)代碼

    js判斷ie版本號的簡單實現(xiàn)代碼

    本篇文章主要是對js判斷ie版本號的簡單實現(xiàn)代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03
  • JavaScript原型及原型鏈終極詳解

    JavaScript原型及原型鏈終極詳解

    本文給大家介紹javascript原型及原型鏈相關(guān)知識,本文分步驟,介紹的非常詳細(xì),對js原型原型鏈相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • 實現(xiàn)51Map地圖接口(示例代碼)

    實現(xiàn)51Map地圖接口(示例代碼)

    這篇文章主要介紹了實現(xiàn)51Map地圖接口的示例代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • es6系列教程_ Map詳解以及常用api介紹

    es6系列教程_ Map詳解以及常用api介紹

    下面小編就為大家?guī)硪黄猠s6系列教程_ Map詳解以及常用api介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Javascript中的常見排序算法

    Javascript中的常見排序算法

    用JavaScript實現(xiàn)的常見排序算法:冒泡排序,選擇排序,插入排序,謝爾排序,快速排序(遞歸),快速排序(堆棧),歸并排序,堆排序。
    2007-03-03
  • javascript中的if語句使用介紹

    javascript中的if語句使用介紹

    在javascript中的一些選擇語句,其實jf語句就是一種,下面舉幾個不錯的示例為大家介紹下,希望對大家學(xué)習(xí)有所幫助
    2013-11-11
  • js中cookie的添加、取值、刪除示例代碼

    js中cookie的添加、取值、刪除示例代碼

    cookie的應(yīng)用在網(wǎng)頁中很常見,在本文為大家介紹下js中如何對cookie進行添加、取值、刪除,感興趣的朋友不要錯過
    2013-10-10
  • Bootstrap表格使用方法詳解

    Bootstrap表格使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap表格使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 淺談Webpack 是如何加載模塊的

    淺談Webpack 是如何加載模塊的

    這篇文章主要介紹了Webpack 是如何加載模塊的,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • js構(gòu)建二叉樹進行數(shù)值數(shù)組的去重與優(yōu)化詳解

    js構(gòu)建二叉樹進行數(shù)值數(shù)組的去重與優(yōu)化詳解

    這篇文章主要給大家介紹了關(guān)于js構(gòu)建二叉樹進行數(shù)值數(shù)組的去重與優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03

最新評論

维西| 临海市| 法库县| 建湖县| 双牌县| 宿迁市| 华蓥市| 南安市| 古交市| 南华县| 重庆市| 公主岭市| 德格县| 邯郸县| 丰台区| 德安县| 改则县| 潍坊市| 双江| 城步| 绿春县| 陆川县| 嘉荫县| 湄潭县| 沁源县| 罗城| 贺兰县| 西华县| 左云县| 永康市| 安丘市| 清流县| 田东县| 垫江县| 合水县| 修水县| 左云县| 昭苏县| 屯昌县| 贵阳市| 酒泉市|