I took this from Google Code Playground http://code.google.com/apis/ajax/playground/
/*CLOSURE
* When a function is defined in another function and it
* has access to the outer function's context even after
* the outer function returns
* An important concept to learn in Javascript
*/
function outerFunction(someNum) {
var someString = 'Hai!';
var content = document.getElementById('content');
function innerFunction() {
content.innerHTML = someNum + ': ' + someString;
content = null; // IE memory leak for DOM reference
}
innerFunction();
}
outerFunction(1);
///////////////////////
Its all ok, but if I have a local variable in the inner function with the same name as a variable in the outer function then how to access that variable?
function outerFunction(someNum) {
var someString = 'Hai!';
var content = document.getElementById('content');
function innerFunction() {
var someString='Hello';
content.innerHTML = someNum + ': ' + someString;
content = null; // IE memory leak for DOM reference
}
innerFunction();
}
outerFunction(1);
You can’t, because the variable of the outer scope is shadowed by the one on your inner function.
The scope chain on the
innerFunctionlooks something like this:innerFunction outerFunction global object ______________________ ________________________ _______________ |* someString = 'Hello'| <---- | someString = 'Hai!' | <---|* outerFunction| ---------------------- |* content = [HTMLElement]| | ..... | |* someNum (argument) | --------------- |* innerFunction | ------------------------- * Denotes a resolvable identifier from the scope of innerFunction.Each function has its own Variable Object, is where the identifiers of Function Declarations, Variable Declarations, and function Formal Parameters live, as properties.
Those objects are not directly accessible by code, the scope chain is formed by all those chained objects.
When an identifier is resolved, the lookup goes up in the scope chain, looking for the first appearance of it, until the global object is reached, if the identifier is not found, a
ReferenceErroris thrown.Give a look to the following articles: