Javascript uses function as scope. Declare a function inside another function creates a different scope. Let’s look at the example code below.
function outer_scope(){ var a = 'I am `a` from outer scope', b = 'I am `b` from outer scope'; console.log( 'logging from outer scope before inner scope function declaration' ); console.log( 'a: ' + a ); console.log( 'b: ' + b ); console.log( '------------------------------------------' ); function inner_scope_1(){ console.log( 'logging from inside function inner_scope_1 before variable declaration' ); console.log( 'a: ' + a ); a = 'I will overwrite the outer scope `a`'; console.log( 'logging from inside function inner_scope_1 after variable declaration' ); console.log( 'a: ' + a ); console.log( '------------------------------------------' ); } function inner_scope_2(){ console.log( 'logging from inside function inner_scope_2 before variable declaration' ); console.log( 'b: ' + b ); var b = 'I will not overwrite the outer scope `b`'; console.log( 'logging from inside function inner_scope_2 after variable declaration' ); console.log( 'b: ' + b ); console.log( '------------------------------------------' ); } inner_scope_1(); inner_scope_2(); a = 'I will be the new `a`'; b = 'I will be the new `b`'; console.log( 'logging from outer scope after inner scope executed' ); console.log( 'a: ' + a ); console.log( 'b: ' + b ); console.log( '------------------------------------------' ); } outer_scope();
Result
logging from outer scope before inner scope function declaration a: I am `a` from outer scope b: I am `b` from outer scope ------------------------------------------ logging from inside function inner_scope_1 before variable declaration a: I am `a` from outer scope logging from inside function inner_scope_1 after variable declaration a: I will overwrite the outer scope `a` ------------------------------------------ logging from inside function inner_scope_2 before variable declaration b: undefined logging from inside function inner_scope_2 after variable declaration b: I will not overwrite the outer scope `b` ------------------------------------------ logging from outer scope after inner scope executed a: I will be the new `a` b: I will be the new `b` ------------------------------------------
From the result above we can see clearly the inner scope variable without var
overwrites the outer scope variable. Variables in the inner scope declare with var
creates a local variable only available inside this scope( function ).
The above example is also called closure
. So when exactly and how to use ? In OOP we use class attributes to store data. With closure we can store data to `higher level`( outer ) scope variables and reuse it.
Example
function photo(){ var name = 'ben'; return{ say_my_name : function(){ console.log( name ); }, rename : function( new_name ){ name = new_name; } }; } var pic = new photo; pic.say_my_name(); pic.rename( 'bibi' ); pic.say_my_name();
Result
ben bibi
node.js function scope
node.js has it’s own function scope conventions. In client side javascript variables declare with var
on the highest scope is a global variable. That’s why we have the self executing anonymous function pattern for not creating global vars.
In client side javascript this equals to window.name = 'ben'
var name = 'ben';
In node.js it wraps a self executing anonymous function when it loads the file
var name = 'ben'; // the above equals to the following ( function( global ){ var name = 'ben'; })( global );
To access the global object we need to declare the variable with global
keyword
global.name = 'ben';
Hope the above examples give you a clear view about what a scope and closure is. Next we will be looking at javascript callbacks.