函數柯里化

函數柯里化

在計算機科學中,柯里化(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;
}

爲什麼使用toString

在對象爲操做數(表達式中的參數或常量)時,解釋器會默認調用對象的valueOf函數,code

當對象爲Date類型且在進行 + 運算時,以及其餘全部狀況中,解釋器會默認調用對象的 toString 函數。htm

所以,對於上述的add函數,當咱們進行相似於 add(1)(2)(3)這樣的調用時,因爲返回的是一個函數,當咱們試圖單獨調用時,解釋器就會對其調用toString來對其轉換。對象

當其在表達式中時,例如 add(1)(2)(3) + 5時,解釋器會先調用_addervalueOf函數,沒有此函數時則會調用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

https://www.jianshu.com/p/2975c25e4d71

相關文章
相關標籤/搜索