Scope determines where a variable is accessible: at the block level for let and const, or at the function level. A closure is a function that keeps access to the variables of the scope where it was created, even after that scope has ended. It makes it possible to keep private state.
Example
function compteur() {
let n = 0
return () => ++n
}