Dê um uso prático de um closure, e o bug clássico.
Prático: um contador ou um cache onde o estado não deve ser alcançável de fora, uma função factory, ou qualquer coisa que precise lembrar um valor entre chamadas. O bug clássico é for (var i = 0; ...) setTimeout(() => console.log(i)) imprimindo o valor final toda vez, porque todos os callbacks fecham sobre um único binding. let cria um binding novo por iteração e resolve isso.