一篇文章讓你看懂JS函數柯理化

函數柯理化

函數柯理化基本概念是:柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術;
兩年前阿里出了一個頗有意思的面試題:
es6

實現一個函數要求add(1)(2)實現數據的相加;

簡單的很,然而這只是一個開始

那add(1)(2)(3)呢?難道咱們return三個函數,那若是是無數個相加呢?

柯里化函數的運行過程實際上是一個參數的收集過程
咱們先聲明一個變量來接受這個參數,當沒有參數傳入的時候表示已經收集完成了,就執行咱們的add方法
面試

這樣全部的參數就傳入了add中,咱們來寫一個add的方法來進行累加的操做

而後咱們只要進行調用就行了;

這樣算是實現了鏈式調用了,可是不支持這種的sum(1,2)(3)(4,5);

那咱們改改代碼,es6有…運算符,能夠支持這個操做
數組

而後進行調用就行了

每次都這樣寫的話,把簡單的問題複雜化了,那咱們能不能像promise同樣把這個作成語法糖的形式來調用呢?

固然是能夠的
首先咱們要把add作成一個參數傳入到咱們的函數裏面,而後採用閉包的形式聲明一個all的數據隊列,而後在返回咱們須要的sum函數進行遞歸的操做
具體代碼以下
promise

調用下

這樣代碼就能夠由本身定義並生成了,代碼中註釋了all=[];這段,這是若是每次執行不累加的話,應該放開的,也就是每次執行一次傳入方法把all數組重置一次。

總結:

調用不一樣的方法來生成不一樣的函數,而後保存起來,供咱們屢次的複用。若是看懂了,麻煩給個贊喲,若是沒看懂,麻煩告訴我那裏不懂,我會及時更新補充的!閉包

相關文章
相關標籤/搜索