Execution Context and Hoisting in JavaScript