4.3 Nesting Named Functions

NN 4, IE 4

4.3.1 Problem

You want to create a function that belongs to only one other function.

4.3.2 Solution

Starting with IE 4 and NN 4, you can nest a function inside another function according to the following syntax model:

function myFuncA( ) {
    // statements go here
    function.myFuncB( ) {
        // more statements go here

In this construction, the nested function may be accessed only by statements in the outer function (but see the Discussion about Netscape 6 and later). Statements in the nested function have access to variables declared in the outer function, as well as to global variables. Statements in the outer function, however, do not have access to the inner function's variables.

4.3.3 Discussion

The basic idea behind nested functions is that you can encapsulate all activity related to the outer function by keeping subroutine functions private to the outer function. Because the nested function is not directly exposed to the global space, you can reuse the function name in the global space or for a nested function inside some other outer function.

Netscape 6 and later extends the environment for nested functions in a logical and convenient way: a nested function acts as a method of the outer function object. There are some interesting ramifications with the way this feature is implemented. Consider the following test function set:

function myFuncA( ) {
    var valueA = "A";
    myFuncB( );
    function myFuncB( ) {
        var valueB = "B";

When you invoke myFuncA( ) from the global space, it invokes its nested function, which dutifully displays the values of the two variables that are defined in the outer and inner functions. IE behaves the same way, as expected. But in Netscape 6 or later, you can invoke the nested function from the global space by way of the outer function:

myFuncA.myFuncB( );

Because the outer function does not execute in this direct access to myFuncB, the valueA variable is not initialized with any value. When myFuncB( ) runs, it shows the value of valueB, but valueA comes back as undefined. Therefore, access to the outer function's variables is possible only when the inner function is invoked by the outer function.

4.3.4 See Also

Recipe 4.1 for a discussion of variable scope.