一文搞懂JS系列(四)之閉包應用-柯里化,偏函數(shù)

寫在最前面:這是我即將開始寫的一個系列硕勿,主要是在框架橫行的時代哨毁,雖然上班用的是框架,但是對于面試源武,以及技術進階扼褪,JS基礎知識的鋪墊是錦上添花,也是不得不學習的一塊知識粱栖,雖然開汽車的不需要很懂汽車话浇,只需要掌握汽車的常用功能即可。但是如果你懂汽車闹究,那你也能更好地開車幔崖,同理。當然渣淤,一篇文章也不會光光只講一個知識點赏寇,一般會將有關聯(lián)的知識點串聯(lián)起來,一邊記錄自己的學習价认,一邊分享自己的學習嗅定,互勉!如果可以的話用踩,也請給我點個贊渠退,你的點贊也能讓我更加努力地更新!

概覽

  • 食用時間: 4-9分鐘
  • 難度: 簡單脐彩,別跑碎乃,看完再走

柯里化

  • 定義

將接受 n 個參數(shù)的 1 個函數(shù)改為只接受一個參數(shù)的 n 個互相嵌套的函數(shù),這么說是不是有點拗口惠奸,說白了就是本來三個參數(shù)梅誓,改為嵌套三層,每次只傳一個參數(shù)佛南,還是先來看下下面的例子吧

  • 實現(xiàn)方式

這是一個返回省市區(qū)的普通函數(shù)证九,接受省,市共虑,區(qū)三個參數(shù)

function getAddress(province,city,area){
  return province + city + area;
}

getAddress('浙江省','杭州市','西湖區(qū)');     //浙江省杭州市西湖區(qū)

現(xiàn)在愧怜,我們根據(jù)上面的柯里化定義,對它進行改造妈拌,成品如下:

function getAddress(province){
 return function (city) {
   return function (area) {
     return province + city + area;
   }
 }
}

getAddress('浙江省','杭州市','西湖區(qū)');    //浙江省杭州市西湖區(qū)

上面的方式已經完成了柯里化的改造拥坛,正如上面所說的蓬蝶,改造成了只接受一個參數(shù)的 n 個互相嵌套的函數(shù)

  • 意義

當然,學會了改造只是一部分猜惋,最主要要理解一下為什么要這樣子改造丸氛,比方說我是專門負責杭州市的城區(qū)劃分的,那么著摔,我們按照前面的第一種方式缓窜,在新建城區(qū)劃分的時候,代碼應該是這樣子的谍咆。

getAddress('浙江省','杭州市','西湖區(qū)');     //浙江省杭州市西湖區(qū)
getAddress('浙江省','杭州市','拱墅區(qū)');     //浙江省杭州市拱墅區(qū)
getAddress('浙江省','杭州市','上城區(qū)');     //浙江省杭州市上城區(qū)

可以看到禾锤,明明浙江省杭州市是固定的,我們每次都要傳入三種參數(shù)摹察,而且恩掷,前面兩個參數(shù)還是可以隨意修改的,我明明只需要管我杭州的事情就可以了供嚎,那么黄娘,我們進行柯里化改造以后,就可以使用下面的這種方式來進行定義

let city = getAddress('浙江省')('杭州市');
city('西湖區(qū)');     //浙江省杭州市西湖區(qū)
city('拱墅區(qū)');     //浙江省杭州市拱墅區(qū)
city('上城區(qū)');     //浙江省杭州市上城區(qū)

可以看到克滴,根據(jù) city() 來創(chuàng)建的城區(qū)逼争,會自動帶上 '浙江省杭州市' ,而且劝赔,無權限操作省市也不需要操作省市誓焦,這就是柯里化的魅力

偏函數(shù)

  • 定義

相信大家經過上面的講解已經大致理解了柯里化,那么望忆,偏函數(shù)就可以很好理解了罩阵,它其實就是 "隨意" 的柯里化竿秆,比方說是有10個參數(shù)的函數(shù)启摄,進行柯里化改造以后,就是一個嵌套10層的每次只傳入1個參數(shù)的函數(shù)幽钢,而偏函數(shù)改造以后歉备,你可以只固定3個入?yún)ⅲ缓蠓祷匾粋€需要7個入?yún)⒌暮瘮?shù)匪燕,偏函數(shù)并不像柯里化那樣蕾羊,十分強調單入?yún)?/strong>的概念,它的目標僅僅是把入?yún)⒎纸鉃閮蓚€部分帽驯,比起柯里化,它更加地隨意一些龟再。

  • 實現(xiàn)方式

    還是上面的例子,現(xiàn)在我們對它來進行偏函數(shù)改造尼变,實現(xiàn)的項目需要仍然是一樣地利凑,我只需要管我杭州的城區(qū)劃分即可浆劲。因為只需要對城區(qū)負責,所以哀澈,對于省市兩個入?yún)⒖梢怨潭ㄅ平瑁敲淳褪且婚_始兩個固定入?yún)ⅲ詈笤俜祷匾粋€需要一個入?yún)⒌暮瘮?shù)割按∨虮ǎ可以看到,偏函數(shù)相對于柯里化也不光"隨意"适荣,更有點根據(jù)實際場景现柠,將必要的關聯(lián)入?yún)⒐潭ㄔ谝黄穑拥睾蛯嶋H使用場景貼合束凑。

    function getAddress(province,city){
      return function (area) {
        console.log(province + city + area);
      }
    }
    

    可以看到晒旅,在進行了改造以后,我們將它變成了第一次傳入2個參數(shù)汪诉,第二次傳入1個參數(shù)废恋,可以看到,我們并沒有刻意地進行單入?yún)?/strong>的改造扒寄,這就是偏函數(shù)

    現(xiàn)在鱼鼓,我們再來繼續(xù)創(chuàng)建城區(qū)劃分

    let city = getAddress('浙江省','杭州市');
    city('西湖區(qū)');     //浙江省杭州市西湖區(qū)
    city('拱墅區(qū)');     //浙江省杭州市拱墅區(qū)
    city('上城區(qū)');     //浙江省杭州市上城區(qū)
    

    可以看到,柯里化偏函數(shù)的動機都是為了讓函數(shù)"記住"一部分的參數(shù)该编,通過封裝的方式迄本,更好地為實際的使用場景服務,而封裝的方式课竣,用的都是閉包,如果你還不懂什么是閉包嘉赎,可以參考我的這一篇博客 一文搞懂JS系列(三)之垃圾回收機制,內存泄漏于樟,閉包

上面的兩個呢公条,都是通過閉包實現(xiàn)對傳入?yún)?shù)的封裝,也算是兩個面試中偶爾能碰到的概念迂曲。在下一篇幅中將講一講另外兩個閉包的應用靶橱,防抖節(jié)流

系列目錄

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拦耐,隨后出現(xiàn)的幾起案子耕腾,更是在濱河造成了極大的恐慌,老刑警劉巖杀糯,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扫俺,死亡現(xiàn)場離奇詭異,居然都是意外死亡固翰,警方通過查閱死者的電腦和手機狼纬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骂际,“玉大人疗琉,你說我怎么就攤上這事∏嘎粒” “怎么了盈简?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長太示。 經常有香客問我柠贤,道長,這世上最難降的妖魔是什么类缤? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任臼勉,我火速辦了婚禮,結果婚禮上呀非,老公的妹妹穿的比我還像新娘坚俗。我一直安慰自己镜盯,他們只是感情好岸裙,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著速缆,像睡著了一般降允。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艺糜,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天剧董,我揣著相機與錄音幢尚,去河邊找鬼。 笑死翅楼,一個胖子當著我的面吹牛尉剩,可吹牛的內容都是我干的。 我是一名探鬼主播毅臊,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼理茎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了管嬉?” 一聲冷哼從身側響起皂林,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚯撩,沒想到半個月后础倍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡胎挎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年沟启,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犹菇。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡美浦,死狀恐怖,靈堂內的尸體忽然破棺而出项栏,到底是詐尸還是另有隱情浦辨,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布沼沈,位于F島的核電站流酬,受9級特大地震影響,放射性物質發(fā)生泄漏列另。R本人自食惡果不足惜芽腾,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望页衙。 院中可真熱鬧摊滔,春花似錦、人聲如沸店乐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眨八。三九已至腺兴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廉侧,已是汗流浹背页响。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工篓足, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闰蚕。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓栈拖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親没陡。 傳聞我的和親對象是個殘疾皇子辱魁,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345