ECMA-262-3 in detail. Chapter 1. Execution Contexts.
Read this article in: Russian, Chinese (version 1, version 2), Arabic, Japaneses, Korean.
- Introduction
- Definitions
- Types of executable code
- Global code
- Function code
- Eval code
- Conclusion
- Additional literature
Introduction
In 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 an execution 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 = [];
The stack is pushed every time on entering a function (even if the function is called recursively or as the constructor), and also at built-in eval
function work.
Global code
This type of code is processed at level Program
: 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), ECStack
looks like:
ECStack = [ globalContext ];
Function code
On entering the function code (all kinds of functions), ECStack
is 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);
Then, ECStack is modified as follows:
// first activation of foo ECStack = [ <foo> functionContext globalContext ]; // recursive activation of foo ECStack = [ <foo> functionContext – recursively <foo> functionContext globalContext ];
Every return from a function exits the current execution context and ECStack
popped accordingly — consecutively and upside-down — quite natural implementation of a stack. After the work of this code is finished, ECStack
again 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 eval
code. In this case, there is a concept of a calling context, i.e. a context from which eval
function is called.
The actions made by eval
, such as variable or function definition, influence exactly the calling context:
// 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
Note, in the strict-mode of ES5, eval
already does not influence the calling context, but instead evaluates the code in the local sandbox.
For the example above we have the following ECStack
modifications:
ECStack = [ globalContext ]; // eval('var x = 10'); ECStack.push({ context: evalContext, callingContext: globalContext }); // eval exited context ECStack.pop(); // foo funciton call ECStack.push(<foo> functionContext); // eval('var y = 20'); ECStack.push({ context: evalContext, callingContext: <foo> functionContext }); // return from eval ECStack.pop(); // return from foo ECStack.pop();
I.e. quite casual and logical call-stack.
eval
function. 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
However, due to security reasons in modern engines it was fixed and is not significant anymore.
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.
Translated by: Dmitry Soshnikov.
Published on: 2010-03-11
Originally written by: Dmitry Soshnikov [ru, read »]
Originally published on: 2009-06-26
Tags: ECMA-262-3, ECMAScript, execution context
This entry was posted on March 11th, 2010 and is filed under ECMAScript.
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response or Trackback from your own site.
19 Comments:
-
John Merge
#permalink
15. March 2010 at 21:29
Great article, as usual
-
Robert Polovsky
#permalink
17. March 2010 at 22:30
Thanks for these excellent articles! Your blog is very professional and useful for every JavaScript programmer.
-
Dmitry A. Soshnikov
#permalink
8. April 2010 at 16:15
@John Merge, @Robert Polovsky, thanks colleagues.
-
justin
#permalink
15. April 2010 at 20:41
It’s an most excellent articles I have read.
so I have tranclated it into Chinese,let more Chinese programmers see it.I would like to tranclate all articles of the set of “ECMA-262-3 in detail”.
you can visit www.cnblogs.com/justinw/archive/2010/04/16/1713086.html
I wish you like it.thanks for the share again
-
Dmitry A. Soshnikov
#permalink
15. April 2010 at 23:01
@justin
Thanks, justin. As Google translate shows me (unfortunately I can’t read Chinese myself ), your translation is good. I am glad to see Chinese colleagues interested in deep JavaScript; that’s great.
I added a link to your translation.
Dmitry.
-
Hans Höglund
#permalink
2. September 2010 at 03:57
Thanks for these series. An excellent overview of the specification.
-
Alex Bars
#permalink
1. December 2010 at 21:24
Thanks, I am trying hard to understand EC, now I know why them call it “Abstract” lol!!
-
David Lee
#permalink
30. September 2011 at 18:25
It is a great article. I want to translate to Korean so that other my friends can take it quickly.
I have a question regarding below:“In SpiderMonkey implementation (built into Firefox, Thunderbird), up to version 1.7, it is possible to pass a calling context as a second argument for eval function.”
I would like to clarify “up to version 1.7″. Did you mean after that version it doesn’t support the feature?
And also did the version mean JavaScript Version? As far as I know there is 1.8.x version of JavaScript.
Thanks.
-
Dmitry A. Soshnikov
#permalink
30. September 2011 at 18:36
@Hans Höglund, @Alex Bars, thanks!
@David Lee, thanks,
I want to translate to Korean
Yes, great. Please contact me when the translation will be ready, I’ll give a link from this article.
I would like to clarify “up to version 1.7″. Did you mean after that version it doesn’t support the feature?
Yes, because it was sort of a hack, it was banned. But you still make test in in older Firefox (2) and Rhino versions.
And also did the version mean JavaScript Version? As far as I know there is 1.8.x version of JavaScript.
Yes, exactly. The version of Mozilla’s SpiderMonkey is meant.
-
Paul
#permalink
18. November 2011 at 07:55
Thank you for the translation. I can’t read Russian and it was nice you take the time in giving this to us in English.
Very helpful.
-
Michael
#permalink
1. April 2012 at 00:46
When is created globalContext in the browser? It is diffrent for EC3 and EC5? Scripts in the browser can load and execute at different times and earlier changes in the global object can be seen later.
-
Dmitry Soshnikov
#permalink
1. April 2012 at 21:17
@Paul, thanks, glad it’s useful.
@Michael, global context corresponds to evaluation of the
script
. Everyscript
tag enters its own global execution context and is treated as separate program. However, all of these scripts are share the same global object.
-
James Li
#permalink
11. April 2012 at 16:16
thanks for the great article. here’s a question: since eval code using a calling context, why the stack push addtional eval context above, while pop only the calling one? what’s the difference?
-
Dmitry Soshnikov
#permalink
12. April 2012 at 09:21
@James Li
It seems just not the best notation I chose for
eval
context pushing (there is a confusion with the realpush
method of arrays which accepts several parameters). There only one context is pushed — the eval's context, and the calling context is just a property:ECStack.push({ context: evalContext, caller: globalContext });
-
James Li
#permalink
12. April 2012 at 18:23
now it’s clear, thank u.
-
kevin wang
#permalink
7. May 2012 at 00:35
If there is only one eval context being pushed, then I guess you miss putting the globalContext at the bottom, does it look like
ECStack.push({ context: evalContext, caller: globalContext }, globalContext );
And one more question, as you said, each script file has its own global context and all script files share another global context which is different from the script one, is it a purely implementation choice?
-
kerry chen
#permalink
13. July 2012 at 20:55
awesome article~~thanks for your summary on specification~~only one question with your comment
global context corresponds to evaluation of the script. Every script tag enters its own global execution context and is treated as separate program. However, all of these scripts are share the same global object.
what is the difference between the global execution context into which scipt tags enter and the global object shared by these scripts?
hope for your reply~~
-
wuyingyou
#permalink
15. February 2013 at 19:02
Hi,Dmitry A. Soshnikov
It’s my honor to read your articles.But I have some problems as following.
For exmaple,how to unstanding the globle code.There is a javascript code.Which’s the global code?Line one?1.var a = 10; 2.var b = "Dimtry"; 3.var c = new Object(); 4.var d = { a: 123, b: 'aaa' }; 5.function D() { alert("I don't know how to unstanding the global code."); } 6.D(); 7.b = a + b;
-
rolfe renvyle
#permalink
19. February 2013 at 13:12
Thank you for these very informative “ECMA-262-3 in Detail” articles. They have done so much to clear up my confusion on ECMA script.
Leave a Reply
Code: For code you can use tags [js], [text], [ruby] and other.
XHTML: You can use these tags: <a class="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>