Function - Why JavaScript declared variable is in the global object before initialization

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

I ve stumbled upon a JavaScript variable behavior I could not explain.

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var

The scope of a variable declared with var is the enclosing function or, for variables declared outside a function, the global scope (which is bound to the global object).

Also it is known that global variables become properties of the global object - window in the browser environments and global in node.js This means if a variable is declared with a var keyword inside a function it becomes local and does not get into the global object.

This example proves it:

(function(){
    var t = 1;
    console.log(t in window, t); // outputs: false 1
}());

http://jsfiddle.net/WmH77/ http://jsfiddle.net/WmH77/

So far so good. However if variable is not initialized it does become a property of the window object despite the fact it is in the function scope.

(function(){
    var t;
    console.log(t in window, t); // outputs: true undefined
}());

http://jsfiddle.net/WmH77/1/ http://jsfiddle.net/WmH77/1/

Why does it happen ? Where can I learn the details of this behavior ? Regular tutorials don t seem to cover this.

Thanks in advance.

[EDIT]: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/in https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/in So in the example one it was equal to

 1  in window

which was false

and in the example two it was

 undefined  in window

which was true.

Answers

The issue is that your test code is using the in operator erroneously. What it s actually testing is whether the name "undefined" is defined in window, not "t". Why? Because the left-hand operand of in is coerced to a string. Because "t" is undefined, it s coerced to the string "undefined", and indeed that property name is present in the global context.

Change the test to

console.log("t" in window, t);

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/16340405/why-javascript-declared-variable-is-in-the-global-object-before-initialization

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils