So this example shows the recursive function call as it executes :
function foo(i)
{
if(i<0)
return;
console.log('begin: ' +i); // Line 1
foo(i-1); // Line 2
console.log('after: ' +i); // Line 3
}
foo(3);
What happens is first you call Line 1, then call the function again at Line 2, and then Line 3
So the execution stack looks like this
console.log('begin: ' +3); // Line 1
foo(2); // Line 2
console.log('after: ' +3); // Line 3
Now next Line 2 would again be converted to :
console.log('begin: ' +3); // Line 1
console.log('begin: ' +2); // Line 1
foo(1); // Line 2
console.log('after: ' +2); // Line 3
console.log('after: ' +3); // Line 3
and so forth
console.log('begin: ' +3); // Line 1
console.log('begin: ' +2); // Line 1
console.log('begin: ' +1); // Line 1
foo(0); // Line 2
console.log('after: ' +1); // Line 3
console.log('after: ' +2); // Line 3
console.log('after: ' +3); // Line 3
And final iteration :
console.log('begin: ' +3); // Line 1
console.log('begin: ' +2); // Line 1
console.log('begin: ' +1); // Line 1
console.log('begin: ' +0); // Line 1
foo(-1) // Line 2 for negative value, we are exiting the recursion.
console.log('after: ' +0); // Line 3
console.log('after: ' +1); // Line 3
console.log('after: ' +2); // Line 3
console.log('after: ' +3); // Line 3