Is window really global in Javascript?
The reason why you can access "out of scope" or "free" variables in ECMAscript is the such called Scope chain. The scope chain is a special property from each Execution context. As mentioned several times before, a context object looks at least like:
- [[scope]]
- Variable / Activation Object
- "this" context value
each time you access a variable(-name) within a context (a function for instance), the lookup process always starts in it's own Activation Object
. All formal parameters, function declarations and locally defined variables (var) are stored in that special object. If the variablename was not found in that object, the search goes into the [[Scope]]
-chain. Each time a function(-context) is initialized, it'll copy all parent context variable/activation objects into its internal [[Scope]]
property. That is what we call, a lexical scope. That is the reason why Closures work in ECMAscript. Since the Global context
also has an Variable Object
(more precisely, **the variable object for the global object is the global object itself) it also gets copied into the functions [[Scope]] property.
That is the reason why you can access window
from within any function :-)
The above explanation has one important conceptional conclusion: Any function in ECMAscript is a Closure, which is true. Since every function will at least copy the global context VO in its [[Scope]] property.
Is window really global in Javascript?
Yes. Unless you create a new variable called window in a narrower scope
function foo() {
var window;
}
Inside foo we can access window, we all know that, but why exactly?
Any function can access variables declared in a wider scope. There is nothing special about window there.