JavaScript Nested function

JavascriptNested Function

Javascript Problem Overview


I got a piece of code for javascript which I just do not understand:

function dmy(d) {
    function pad2(n) {
        return (n < 10) ? '0' + n : n;
    }

    return pad2(d.getUTCDate()) + '/' +
       pad2(d.getUTCMonth() + 1) + '/' +
       d.getUTCFullYear();
}

function outerFunc(base) {
    var punc = "!";

    //inner function
    function returnString(ext) {
       return base + ext + punc;
    }

    return returnString;
}

How can a function be defined within another function? Can we call pad2() from outside of my() function?

Please put some light on it. Thanks

Javascript Solutions


Solution 1 - Javascript

Functions are another type of variable in JavaScript (with some nuances of course). Creating a function within another function changes the scope of the function in the same way it would change the scope of a variable. This is especially important for use with closures to reduce total global namespace pollution.

The functions defined within another function won't be accessible outside the function unless they have been attached to an object that is accessible outside the function:

function foo(doBar)
{
  function bar()
  {
    console.log( 'bar' );
  }

  function baz()
  {
    console.log( 'baz' );
  }

  window.baz = baz;
  if ( doBar ) bar();
}

In this example, the baz function will be available for use after the foo function has been run, as it's overridden window.baz. The bar function will not be available to any context other than scopes contained within the foo function.

as a different example:

function Fizz(qux)
{
  this.buzz = function(){
    console.log( qux );
  };
}

The Fizz function is designed as a constructor so that, when run, it assigns a buzz function to the newly created object. That is, you'd use it like this:

const obj = new Fizz();
obj.buzz();

or more concisely (if you don't need to keep the object after calling buzz):

new Fizz().buzz();

Solution 2 - Javascript

It is called closure.

Basically, the function defined within other function is accessible only within this function. But may be passed as a result and then this result may be called.

It is a very powerful feature. You can see more explanation here:

javascript_closures_for_dummies.html mirror on Archive.org

Solution 3 - Javascript

function x() {}

is equivalent (or very similar) to

var x = function() {}

unless I'm mistaken.

So there is nothing funny going on.

Solution 4 - Javascript

Function-instantiation is allowed inside and outside of functions. Inside those functions, just like variables, the nested functions are local and therefore cannot be obtained from the outside scope.

function foo() {
    function bar() {
        return 1;
    }
    return bar();
}

foo manipulates bar within itself. bar cannot be touched from the outer scope unless it is defined in the outer scope.

So this will not work:

function foo() {
    function bar() {
        return 1;
    }
}

bar(); // throws error: bar is not defined

Solution 5 - Javascript

When you declare a function within a function, the inner functions are only available in the scope in which they are declared, or in your case, the pad2 can only be called in the dmy scope.

All the variables existing in dmy are visible in pad2, but it doesn't happen the other way around :D

Solution 6 - Javascript

It's perfectly normal in JavaScript (and many languages) to have functions inside functions.

Take the time to learn the language, don't use it on the basis that it's similar to what you already know. I'd suggest watching Douglas Crockford's series of YUI presentations on JavaScript, with special focus on Act III: Function the Ultimate (link to video download, slides, and transcript)

Solution 7 - Javascript

function foo() {
  function bar() {
    return 1;
  }
}
bar();


Will throw an error. Since bar is defined inside foo, bar will only be accessible inside foo.
To use bar you need to run it inside foo.

function foo() {
  function bar() {
    return 1;
  }
  bar();
}

Solution 8 - Javascript

Nested functions can be the basis for writing a modular group of related functions, kind of halfway to full object-oriented programming (static classes only).

Here is an example of such a group of functions, in this case to convert a value to a JSON string or a JSON string to a value.

Notice how the inner functions are grouped into an Object inside an outer function, and how the Object is then stored into a group name. This is the only name directly visible from outside the group. To reach any contained function from outside, you just write the group name, a period, then the function name. To reach a contained function from inside, you can use the same notation, or 'this', a period, then the function name.

//--------------------------------------------------------------------//
//		Module J:
//			Convert from and to JSON strings
//--------------------------------------------------------------------//
const J=NewJ();
function NewJ()
	{
	const mod=
		{
		From:(str)=>
			{
			return JSON.parse(str);
			}, // From
		To:(val)=>
			{
			return JSON.stringify(val,null,3);
			} // To
		}; // mod
	return mod;
	} // NewJ

//--------------------------------------------------------------------//
//		End Module J
//--------------------------------------------------------------------//

Here's a test:

console.log(J.To({A:'a'}));

Console output:

{
   "A": "a"
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThomasView Question on Stackoverflow
Solution 1 - JavascriptzzzzBovView Answer on Stackoverflow
Solution 2 - JavascriptTadeckView Answer on Stackoverflow
Solution 3 - JavascriptAndreasView Answer on Stackoverflow
Solution 4 - JavascriptDavid GView Answer on Stackoverflow
Solution 5 - JavascriptpedrochavesView Answer on Stackoverflow
Solution 6 - JavascriptJoaquim RendeiroView Answer on Stackoverflow
Solution 7 - JavascriptJustin LiuView Answer on Stackoverflow
Solution 8 - JavascriptDavid SpectorView Answer on Stackoverflow