var f = function () {
var n = 42;
return function () {
return n;
};
}();
var result = f();
alert(result);
The function f is a self-invoking function that returns a function, that returns the variable n declared in the outer function.
The alert of the above code is, as you'd expect, 42
Now let's try rewriting the above code so that instead of returning a function that is declared internally, it now returns a function that was defined outside (but that does the same thing):
var f2 = function () {
return n;
};
var f = function () {
var n = 42;
return f2;
}();
var result = f();
alert(result);
This should return the same result, no?
Actually, we are greeted with the following error:
This is because of JavaScript's static scoping, also known as lexical scoping, because matching a variable to its binding only requires analysis of the program text.
This means that the scope of the variable is determined at compile-time, and from the second code snippet we can see that during compile time variable n of function f2 has window (window.n) as it's scope; and since n doesn't exist in the global scope, it is undefined.