La portée détermine où une variable est accessible : au niveau d'un bloc pour let et const, ou d'une fonction. Une closure est une fonction qui garde l'accès aux variables de la portée où elle a été créée, même après la fin de cette portée. Elle permet de conserver un état privé.
Exemple
function compteur() {
let n = 0
return () => ++n
}