JavaScript函數(shù)式編程實(shí)現(xiàn)

JavaScript

1.嵌套函數(shù)的有趣之處在于它的變量作用域規(guī)則:它們可以訪問嵌套它們(或多重嵌套)的函數(shù)的參數(shù)和變量

2.大多數(shù)方法調(diào)用使用點(diǎn)符號來訪問屬性古瓤,使用方括號(屬性訪問表達(dá)式)也可以進(jìn)行屬性訪問操作壳繁。下面兩個(gè)例子都是函數(shù)調(diào)用0["m"](x,y);a[0](z);

3.方法調(diào)用可能包含更復(fù)雜的屬性訪問表達(dá)式:f().m();

4.方法和this關(guān)鍵字是面向?qū)ο缶幊谭独暮诵?/p>

5.方法鏈-當(dāng)方法的返回值是一個(gè)對象咬清,每個(gè)對象還可以再調(diào)用它的方法,這種方法調(diào)用序列中睬愤,每次調(diào)用的結(jié)果都是另外一個(gè)表達(dá)式的組成部分喳钟,以jQuery庫為例$(":header").map(function(){return this.id}).get().sort();

一等公民函數(shù)

1.在JavaScript中,函數(shù)不僅僅是一種語法猎莲,也是值,這意味著可以將函數(shù)賦值給變量技即,存儲在對象的屬性或數(shù)組的元素中著洼,作為參數(shù)傳入另外一個(gè)函數(shù)

2.在Java中,函數(shù)是程序的一部分,但無法被程序操作

JS可選形參

    function getPropertyNames(o,/*optional*/ a){

    if(a===undefined)a=[];

    for(var property in o)a.push(property);

          return a;

    }

var a = getPropertyNames(o);//將o的屬性存儲到一個(gè)新數(shù)組中

getPropertyNames(p,a);//將P的屬性附加至數(shù)組中

可變長的參數(shù)列表:實(shí)參對象##

1.當(dāng)調(diào)用函數(shù)的時(shí)候傳入的實(shí)參個(gè)數(shù)超過函數(shù)定義時(shí)的形參個(gè)數(shù)時(shí)身笤,沒有辦法直接獲得未命名值的引用豹悬,參數(shù)對象解決了這個(gè)問題

2.在函數(shù)體內(nèi),標(biāo)識符arguments是指向?qū)崊ο蟮囊靡狠瑢?shí)參對象是一個(gè)類數(shù)組對象

3.JavaScript的默認(rèn)行為是省略的實(shí)參都將是undefined瞻佛,多出的參數(shù)會自動(dòng)省略

可變長的參數(shù)列表:不定實(shí)參函數(shù)

      function max(/*...*/){

      var max = Number.NEGATIVE_INFINITY;

      for(var i = 0 ;i < arguments.length;i++)

      if(arguments[i] > max) max = arguments[i];

      return max;
        }

varargs function=>不定實(shí)參函數(shù)

自定義函數(shù)屬性

  uniqueInteger.counter = 0 ;

//每次調(diào)用這個(gè)函數(shù)都會返回一個(gè)不同的整數(shù)

//它使用一個(gè)屬性來記住下一次將要放回的值

function uniqueInteger(){

      return uniqueInteger.counter++;

}

1.JavaScript中的函數(shù)并不是原始值,而是一種特殊的對象娇钱,也就是說函數(shù)可以擁有屬性

2.當(dāng)函數(shù)需要一個(gè)"靜態(tài)"變量來在調(diào)用時(shí)保持某個(gè)值不變伤柄,最方便的方式就是給函數(shù)定義屬性,而不是定義全局變量(定義全局變量會讓命名空間變得更加雜亂無章

作為命名空間的函數(shù)

//將模塊代碼放入函數(shù)中文搂,應(yīng)對不同上下文中命名空間可能的沖突

    function mymodule(){

            //這個(gè)模塊所使用的所有變量都是全局變量适刀,而不是污染全局命名空間

    }

    mymodule();

以上代碼也定義了一個(gè)單獨(dú)的全局變量,名叫"mymodule"的函數(shù)

===========================================================

    (function(){     //mymodule()函數(shù)重寫為匿名的函數(shù)表達(dá)式

            //模塊代碼

            //例如:處理瀏覽器兼容性常用煤蹭,依據(jù)對客戶端環(huán)境的判斷返回不同的值

      }());          //結(jié)束函數(shù)定義并立即調(diào)用它

===========================================================

定義匿名函數(shù)并立即在單個(gè)表達(dá)式中調(diào)用它的寫法非常常見笔喉,已經(jīng)成為一種慣用法

1.在變量中聲明的變量在整個(gè)函數(shù)體內(nèi)都是可見的(包括在嵌套的函數(shù)中),在函數(shù)的外部是不可見的

2.不在任何函數(shù)內(nèi)聲明的變量是全局變量硝皂,在整個(gè)JavaScript程序中都是可見的

3.在JavaScript中是無法聲明只在一個(gè)代碼塊內(nèi)可見的變量的然遏,基于這個(gè)原因,我們常常簡單地定義一個(gè)函數(shù)用作臨時(shí)的命名空間吧彪,在這個(gè)命名空間內(nèi)定義的變量都不會污染到全局命名空間

prototype屬性

-每一個(gè)函數(shù)都包含一個(gè)prototype屬性,這個(gè)屬性是指向一個(gè)對象的引用丢早,這個(gè)對象叫做"原型對象"(prototype object)

-每一個(gè)函數(shù)都包含不同的原型對象姨裸,當(dāng)將函數(shù)用作構(gòu)造函數(shù)的時(shí)候,新創(chuàng)建的對象會從原型對象上繼承屬性

高階函數(shù)

-所謂高階函數(shù)(higher-order function)就是操作函數(shù)的函數(shù)

-它接收一個(gè)或多個(gè)函數(shù)作為參數(shù)怨酝,并返回一個(gè)新函數(shù)

純粹函數(shù)式編程

    var data = [1,1,3,5,5]        //我們要處理的數(shù)據(jù)

    var sum = function(x,y){return x+y;};    //兩個(gè)初等函數(shù)

    var product = function(x,y){return x*y;};

    var neg = partial(product , -1);

    var square = partial(Math.pow ,undefined ,2);

    var sqrt = partial(Math.pow,undefined,.5);

    var reciprocal = partial(Math.pow,undefined,-1);

//現(xiàn)在開始計(jì)算平均差和標(biāo)準(zhǔn)差傀缩,所有的函數(shù)調(diào)用都不帶運(yùn)算符

//這段代碼看起來很像Lisp代碼

    var mean =         product(reduce(data,sum),reciprocal(data.length));

    var stddev = sqrt(product(reduce(map(data,

                              compose(square,

                                    partial(sum,neg(mean)))),

                              sum),

                                reciprocal(sum(data.length,-1))));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市农猬,隨后出現(xiàn)的幾起案子赡艰,更是在濱河造成了極大的恐慌,老刑警劉巖斤葱,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慷垮,死亡現(xiàn)場離奇詭異,居然都是意外死亡揍堕,警方通過查閱死者的電腦和手機(jī)料身,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衩茸,“玉大人芹血,你說我怎么就攤上這事。” “怎么了幔烛?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵啃擦,是天一觀的道長。 經(jīng)常有香客問我饿悬,道長令蛉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任乡恕,我火速辦了婚禮言询,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傲宜。我一直安慰自己运杭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布函卒。 她就那樣靜靜地躺著辆憔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪报嵌。 梳的紋絲不亂的頭發(fā)上虱咧,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音锚国,去河邊找鬼腕巡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛血筑,可吹牛的內(nèi)容都是我干的绘沉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼豺总,長吁一口氣:“原來是場噩夢啊……” “哼车伞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喻喳,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤另玖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后表伦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谦去,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年蹦哼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哪轿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翔怎,死狀恐怖窃诉,靈堂內(nèi)的尸體忽然破棺而出杨耙,到底是詐尸還是另有隱情,我是刑警寧澤飘痛,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布珊膜,位于F島的核電站,受9級特大地震影響宣脉,放射性物質(zhì)發(fā)生泄漏车柠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一塑猖、第九天 我趴在偏房一處隱蔽的房頂上張望竹祷。 院中可真熱鬧,春花似錦羊苟、人聲如沸塑陵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽令花。三九已至,卻和暖如春凉倚,著一層夾襖步出監(jiān)牢的瞬間兼都,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工稽寒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扮碧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓杏糙,卻偏偏與公主長得像慎王,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子搔啊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容