Relaciona-se ao conceito de Escopo. Escopo refere-se ao "mundo" em que uma função "vive" e, portanto, consegue enxergar seus elementos.
// Este arquivo representa o Estado const x = 3 function cidade() { const x = 97 function bairro(n) { return x + n } return bairro } // Não funciona: bairro está fora do escopo Estado //console.log(bairro(5)) // Funciona: cidade está dentro do escopo Estado console.log(cidade()(5)) module.exports = cidade()
Closure é quando uma função "lembra" de seu escopo léxico, ou seja, o mundo em que ela foi definida/escrita. Logo, mesmo que a função seja executada fora desse escopo léxico, ela irá priorizar suas "origens"
// Arquivo que representa um novo Estado const bairro = require('./principios10_closureEscopo') const x = 1000 // O valor de x acima não influencia // porque o bairro "lembra" de suas origens console.log(bairro(10))