https://mysteryweevil.medium.com/understanding-scope-and-lexical-environment-in-javascript-6dc3b32c6a98