Javacsript: Variadic Function

Belajar Higher Order Function, first class citizen of Javascript userland.

function counter(a) {
    let count = a;
    return function (...b) {
        if (b.length > 0) {
            return count += b.reduce((b1, b2) => b1 + b2)
        } else {
            return ++count;
        }
    };
}

// > counter(1)(); menghasilkan 2
// > counter(1)(9); menghasilkan 10
// > let ret = counter(5); menghasilkan undefined
// > ret(4); menghasilkan 9
// > ret(2,3,5,7); menghasilkan 35

Fungsi di atas menggunakan satu variabel wajib dan beberapa variabel pilihan. Satu variabel wajib di awal tidak akan ditambah lebih dari 1 jika tidak terdapat variabel pilihan setelahnya.
Tujuan penggunaan fungsi di dalam fungsi adalah closure, dimana closure baru dibuat setiap ada open curly braces { dan ditutup setiap ada close curly braces }. Keyword let dan const digunakan untuk membuat variabel di dalam closure dan tetap hidup di dalam closure saja. Fungsi tidak harus mengembalikan fungsi namun harus mengembalikan nilai. Sehingga setiap fungsi dapat digunakan oleh fungsi lain sebagai parameter.
Hasilnya, terdapat satu variabel default untuk tetap dikembalikan jika operasi di dalam fungsi gagal atau fungsi digunakan tanpa parameter. Namun, fungsi dapat digunakan untuk operasi dengan parameter tak terbatas, ini hanya fungsi pada umumnya kecuali the one which accepts a variable number of arguments.

Update: Reduced curly braces


function counter(a) {
    let count = a;
    return function (...b) {
        if (b.length > 0) return count += b.reduce((b1, b2) => b1 + b2)
        return ++count
    }
}