Javascript function scoping and hoisting
Function hoisting means that functions are moved to the top of their scope. That is,
function b() { a = 10; return; function a() {} }
will be rewritten by the interpeter to this
function b() { function a() {} a = 10; return;}
Weird, eh?
Also, in this instance,
function a() {}
behaved the same as
var a = function () {};
So, in essence, this is what the code is doing:
var a = 1; //defines "a" in global scopefunction b() { var a = function () {}; //defines "a" in local scope a = 10; //overwrites local variable "a" return; } b(); alert(a); //alerts global variable "a"
What you have to remember is that it parses the whole function and resolves all the variables declarations before executing it. So....
function a() {}
really becomes
var a = function () {}
var a
forces it into a local scope, and variable scope is through the entire function, so the global a variable is still 1 because you have declared a into a local scope by making it a function.
The function a
is hoisted inside function b
:
var a = 1; function b() { function a() {} a = 10; return;} b(); alert(a);
which is almost like using var
:
var a = 1; function b() { var a = function () {}; a = 10; return;} b(); alert(a);
The function is declared locally, and setting a
only happens in the local scope, not the global var.