Executing an Ecmascript Program, calling a function and calling eval causes a new execution context to be created. While the global scope uses a fresh Lexical Environment, function will inherit it from the calling context. Eval will either inherit it from the calling context, or global if that's not present. In strict mode eval will always add a layer of execution stack as padding, meaning that Identifiers can be resolved just fine, but creating new bindings will not be possible in the global or calling scope. Detailed algorithms can be found in the following paragraphs.
Calling return exits the current execution context and returns to the next context on the stack. Calling throw can exit multiple contexts, depending on where the error is catched.