O conceito é simples: você pode chamar uma função com menos argumentos do que espera, então ela retorna uma nova função que recebe os argumentos que faltam.
Você pode escolher se vai passar todos os argumentos de uma vez, ou um por vez.
var add = function(x) {
return function(y) {
return x + y