Em primeiro lugar, não há nada que seja impossível sem usar encerramentos. Você sempre pode substituir um fechamento por um objeto que implementa uma interface específica. É apenas uma questão de brevidade e acoplamento reduzido.
Em segundo lugar, tenha em mente que os fechamentos são frequentemente usados de forma inadequada, onde uma simples referência de função ou outro construto seria mais claro. Você não deve tomar todos os exemplos que você vê como uma boa prática.
Onde os closures realmente brilham sobre outros constructos é quando usamos funções de ordem mais alta, quando você realmente precisa para se comunicar, e você pode torná-lo um one-liner, como neste exemplo JavaScript do página da wikipedia sobre fechamentos :
// Return a list of all books with at least 'threshold' copies sold.
function bestSellingBooks(threshold) {
return bookList.filter(
function (book) { return book.sales >= threshold; }
);
}
Aqui, threshold
é muito sucinto e naturalmente comunicado de onde é definido para onde é usado. Seu escopo é precisamente limitado o menor possível. filter
não precisa ser escrito para permitir a possibilidade de passar dados definidos pelo cliente como um limite. Não precisamos definir estruturas intermediárias com o único objetivo de comunicar o limiar nessa pequena função. É totalmente auto-suficiente.
Você pode escrever isso sem o fechamento, mas isso exigirá muito mais código e será mais difícil de ser seguido. Além disso, o JavaScript tem uma sintaxe lambda razoavelmente detalhada. Em Scala, por exemplo, todo o corpo da função seria:
bookList filter (_.sales >= threshold)
Se você pode, no entanto, usar o ECMAScript 6 , graças ao fat arrow functions até o código JavaScript se torna muito mais simples e pode ser colocado em uma única linha.
const bestSellingBooks = (threshold) => bookList.filter(book => book.sales >= threshold);
No seu próprio código, procure lugares onde você gera muito clichê apenas para comunicar valores temporários de um lugar para outro. Essas são excelentes oportunidades para considerar a substituição por um fechamento.