Every execution context has its own variable object associated with it. Variables declared in the source text are added as properties to the variable object.
This mechanism is a way of making sure that variables that are local to one execution context do not affect the values of variables in another.
For function, anonymous, and implementation-supplied code contexts, any passed in arguments (parameters) are also added as properties of the variable object.
Which particular variable object is used, and what attributes its properties take on depends on the type of code.