在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成html
接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。數組
這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。函數
add(1)(2)(3) = 6; add(1, 2, 3)(4) = 10; add(1)(2)(3)(4)(5) = 15;
這個 add
函數就是一個柯里化的函數,實現以下:.net
function add() { // 將僞數組arguments轉化爲數組並存儲在_args中,之後接受的全部參數也都存儲在_args中 let _args = [].slice.call(arguments); // _adder 函數將之後接收的參數都存儲到_args中 let _adder = function () { _args.push(...arguments); // 返回自身(函數),從而能夠無限接收參數 return _adder; } // 爲什麼使用toString見下文 // toString 返回最後取值, 即全部參數的和 _adder.toString = function () { return _args.reduce(function (sum, item) { return sum + item; }); } //返回_adder函數 return _adder; }
在對象爲操做數(表達式中的參數或常量)時,解釋器會默認調用對象的valueOf
函數,code
當對象爲Date
類型且在進行 +
運算時,以及其餘全部狀況中,解釋器會默認調用對象的 toString
函數。htm
所以,對於上述的add
函數,當咱們進行相似於 add(1)(2)(3)
這樣的調用時,因爲返回的是一個函數,當咱們試圖單獨調用時,解釋器就會對其調用toString
來對其轉換。對象
當其在表達式中時,例如 add(1)(2)(3) + 5
時,解釋器會先調用_adder
的valueOf
函數,沒有此函數時則會調用toString
函數。blog
參考文章ci
https://blog.csdn.net/shaofei63/article/details/42743245get
https://jingyan.baidu.com/album/3c48dd347c0474e10be358af.html?picindex=3
https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin