從面試題‘手寫一個bind函數(shù)’分析函數(shù)柯里化

手寫一個bind函數(shù)是面試中一個常見的面試題,由于bind函數(shù)是es5之后才有的,有些低版本的游覽器可能不支持截珍,有時候在開發(fā)中常常需要手寫封裝一個bind()函數(shù)锚扎。
那怎么實現(xiàn)bind()函數(shù)的封裝呢吞瞪?
這里就不得不提函數(shù)柯里化,那什么是函數(shù)柯里化呢工秩?請看百度百科的解釋:

在計算機科學(xué)中尸饺,柯里化(Currying)是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù)进统,并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。這個技術(shù)由 Christopher Strachey 以邏輯學(xué)家 Haskell Curry 命名的浪听,盡管它是 Moses Schnfinkel 和 Gottlob Frege 發(fā)明的螟碎。
這不是針對js語言,大多數(shù)語言都支持該特性
請看一個簡單的栗子

function add(x+y){
let result=x+y    //我們平時寫一個兩個數(shù)相加的函數(shù)是這樣寫的迹栓,
return result
}
console.log(add(3,7)  //10

如果現(xiàn)在有一個需求掉分,add函數(shù)調(diào)用一次只能加一個數(shù),需要調(diào)用兩次才能出結(jié)果克伊,這里就需要用到函數(shù)柯里化 /想要了解函數(shù)柯里化最好能先對閉包有一個深入的了解/

function add(x){
let result=x
return function(y){                //這里返回一個函數(shù)
  return result=result+y
}
}
let add1=add(3)(7)
console.log(add1)  //10

可以看出函數(shù)柯里化就是是利用了閉包的特性酥郭,
所以以后在看代碼中看到以下的調(diào)用方式就不足為怪了

add(2)(3)(9)
add(2,3,5)(4,6)(3,4)

好了,現(xiàn)在就回到標題,那么很顯然可以利用函數(shù)柯里化手寫bind()函數(shù)
思路:1.使用es6的rest參數(shù)獲取傳入的參數(shù)愿吹,合并兩次傳入的參數(shù)
2.使用函數(shù)柯里化(閉包)不从,和原生apply方法

/*
   param obj  綁定的對象
    */
    Object.prototype.myBind=function(obj,...params){            //使用es6 rest參數(shù),
        let paramOne=params                                                //也可以使用es5中的argurments獲取傳入的參數(shù)

        let self=this
       return function(...params){
            let paramsTwo=params
            let mergeParams=[...paramOne,...paramsTwo]      //合并兩次傳入的參數(shù)
            console.log(mergeParams)
            return self.apply(obj,mergeParams)
        }
    }
  let obj1={
      sayHello:function(str1,str2){
          return str1+ str2+ this.name
      }
  }
  let obj2={
      name:"帥朗朗"
  }

  let result=obj1.sayHello.myBind(obj2,'hello')('world')

  console.log(result)          //helloworld帥朗朗

由此可見函數(shù)柯里化的主要作用和特點就是參數(shù)復(fù)用犁跪、提前返回和延遲執(zhí)行椿息。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坷衍,隨后出現(xiàn)的幾起案子寝优,更是在濱河造成了極大的恐慌,老刑警劉巖枫耳,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乏矾,死亡現(xiàn)場離奇詭異,居然都是意外死亡迁杨,警方通過查閱死者的電腦和手機钻心,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仑最,“玉大人扔役,你說我怎么就攤上這事【剑” “怎么了亿胸?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長预皇。 經(jīng)常有香客問我侈玄,道長,這世上最難降的妖魔是什么吟温? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任序仙,我火速辦了婚禮,結(jié)果婚禮上鲁豪,老公的妹妹穿的比我還像新娘潘悼。我一直安慰自己律秃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布治唤。 她就那樣靜靜地躺著棒动,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宾添。 梳的紋絲不亂的頭發(fā)上船惨,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音缕陕,去河邊找鬼粱锐。 笑死,一個胖子當(dāng)著我的面吹牛扛邑,可吹牛的內(nèi)容都是我干的怜浅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鹿榜,長吁一口氣:“原來是場噩夢啊……” “哼海雪!你這毒婦竟也來了锦爵?” 一聲冷哼從身側(cè)響起舱殿,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎险掀,沒想到半個月后沪袭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡樟氢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年冈绊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埠啃。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡死宣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碴开,到底是詐尸還是另有隱情毅该,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布潦牛,位于F島的核電站眶掌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巴碗。R本人自食惡果不足惜朴爬,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橡淆。 院中可真熱鬧召噩,春花似錦母赵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抵蚊,卻和暖如春施绎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贞绳。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工谷醉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冈闭。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓俱尼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萎攒。 傳聞我的和親對象是個殘疾皇子遇八,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 孕33周+6去醫(yī)院做產(chǎn)檢,尿常規(guī)查出蛋白4個+耍休,醫(yī)生看了報告二話沒說就給我開了住院單刃永。雖然當(dāng)我瞥到報告從自動打印機...
    梅之妖妖閱讀 557評論 0 1
  • 晚上下班時遇到李sir,談到他兒子在國外碩士畢業(yè)羊精,他去美國參加畢業(yè)典禮斯够,話就停不住。他講了怎樣幫兒子從不好的高考大...
    薇薇安的30天閱讀 141評論 0 0