https://mysteryweevil.medium.com/understanding-lexical-scope-and-closures-in-javascript-a-practical-guide-ddcb1dec9aad