Closure

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))