ECMA-262-3 in detail. Chapter 1. Execution Contexts.
2012-02-09 18:07
253 查看
转载地址http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/
IntroductionIn this note we will mention execution contexts of ECMAScript and types of executable code related with them.
Definitions
Every time when control is transferred to ECMAScript executable code, control is entered anexecution context.Execution context (abbreviated form — EC) is the abstract concept used by ECMA-262 specification for typification and differentiation of an executable code.
The standard does not define accurate structure and kind of EC from the technical implementation viewpoint; it is a question of the ECMAScript-engines implementing the standard.
Logically, set of active execution contexts forms a stack. The bottom of this stack is always a global context, the top — a current (active) execution context. The stack is modified (pushed/popped) during the entering and exiting various kinds of EC.
Types of executable code
With abstract concept of an execution context, the concept of type of an executable code is related. Speaking about code type, it is possible in the certain moments to mean an execution context.For examples, we define the stack of execution contexts as an array:
ECStack = []; |
evalfunction work.
Global code
This type of code is processed at levelProgram: i.e. the loaded external
.js-file or the local inline-code (inside the
<script></script>tags). The global code does not include any parts of a code which are in bodies of functions.
At initialization (program start),
ECStacklooks like:
ECStack = [ globalContext ]; |
Function code
On entering the function code (all kinds of functions),ECStackis pushed with new elements. It is necessary to notice that the code of concrete function does not include codes of the inner functions.
For example, let’s take the function which calls itself recursively once:
( function foo(flag) { if (flag) { return ; } foo( true ); })( false ); |
// first activation of foo ECStack = [ <foo> functionContext globalContext ]; // recursive activation of foo ECStack = [ <foo> functionContext – recursively <foo> functionContext globalContext ]; |
ECStackpopped accordingly — consecutively and upside-down — quite natural implementation of a stack. After the work of this code is finished,
ECStackagain contains only
globalContext— until the program end.
A thrown but not caught exception may also exit one or more execution contexts:
( function foo() { ( function bar() { throw 'Exit from bar and foo contexts' ; })(); })(); |
Eval
code
Things are more interesting with evalcode. In this case, there is a concept of a calling context, i.e. a context from which
evalfunction is called.
The actions made by
eval, such as variable or function definition, influence exactly the callingcontext:
// influence global context eval ( 'var x = 10' ); ( function foo() { // and here, variable "y" is // created in the local context // of "foo" function eval ( 'var y = 20' ); })(); alert(x); // 10 alert(y); // "y" is not defined |
evalalready does not influence the calling context, but instead evaluates the code in the local sandbox.
For the example above we have the following
ECStackmodifications:
ECStack = [ globalContext ]; // eval('var x = 10'); ECStack.push( evalContext, callingContext: globalContext ); // eval exited context ECStack.pop(); // foo funciton call ECStack.push(<foo> functionContext); // eval('var y = 20'); ECStack.push( evalContext, callingContext: <foo> functionContext ); // return from eval ECStack.pop(); // return from foo ECStack.pop(); |
In old SpiderMonkey implementations (Firefox), up to version 1.7, it was possible to pass a calling context as a second argument for
evalfunction. Thus, if the context still exists, it is possible to influence private variables:
function foo() { var x = 1; return function () { alert(x);}; }; var bar = foo(); bar(); // 1 eval ( 'x = 2' , bar); // pass context, influence internal var "x" bar(); // 2 |
Conclusion
This theoretical minimum is required for the further analysis of details related with execution contexts, such as variable object or scope chain, which descriptions can be found in the appropriate chapters.Additional literature
Corresponding section of ECMA-262-3 specification — 10. Execution Contexts.相关文章推荐
- ECMA-262-5 in detail. Chapter 2. Strict Mode.
- Ecmascript-262-3 in detail. Chapter 4. Scope chain.
- Note for Strict Mode in ECMA-262-5
- [THINKING IN C++]CHAPTER 03:EX 26
- Archiving(Chapter 18 of Programming in Objective-C 2.0)
- ECMA 262 标准中文版
- Detail in Response.redirect and Server.transfer in ASP.NET
- Think in java 答案_Chapter 2_Exercise 11
- Think in java 答案_Chapter 3_Exercise 2
- Think in java 答案_Chapter 4_Exercise 5
- DS.Lab筆記 - ECMA-262-5 - 文法环境概论
- Think in java 答案_Chapter 5_Exercise 7
- 《ActiveMQ In Action》Chapter 4 Connecting to ActiveMQ
- DS.Lab筆記 - ECMA-262-3: 求值策略
- Java Concurrency In Practice - Chapter 1 Introduction
- ECMA262深入浅出
- [JavaScript]ECMA-262-3 深入解析.第一章.执行上下文
- Summarizes chapter one of datastructures and program design in C++
- [译]6.1. Data Structures Featured in This Chapter 本章涉及到的数据结构
- sharepoint ECMA using a custom contentType to creating a list in SubSite