I am running into a strange scope issue with Javascript (see JSFiddle):
var someGlobal = 3;
function someF() {
// undefined issue
alert(someGlobal);
var someGlobal = 5;
// Displays 5
alert(someGlobal);
}
function someF2() {
// Displays 3, why?
alert(someGlobal);
}
someF();
someF2();
Why doesn't Javascript throws an undefined issue in someF2()
? How come someF2()
can access the someGlobal
, and someF()
not? How can I make sure a global variable is accessible in a function?
Remark:
In both cases, the functions start by calling alert(someglobal)
, why does one function throw an undefined issue and the other not?
Here is an example of how to use both the local and global variable inside
someF
by usingthis
.
someF
creates a new (locally scoped) variable calledsomeGlobal
(which masks the globalsomeGlobal
) and assigns a value to it. It doesn't touch the globalsomeGlobal
(although cannot access it because there is another variable with the same name in scope).var
statements are hoisted, sosomeGlobal
is masked for all ofsomeF
(not just after thevar
statement). The value of the localsomeGlobal
isundefined
until a value is assigned to it.someF2
access the original (untouched) globalsomeGlobal
.Since you are declaring a local variable with the same name. So it assigns the value to the local variable. Just remove the var from var someGlobal in someF() and it should be fine.
someF2 displays 3 because it still is 3.
In someF() you create a new variable that happens to have the same name as someGlobal. That does not do anything to the original someGlobal, it just creates a new variable locally to function someF that goes away when that function ends.
So you have local variables (e.g. created inside someF with var) and global ones.