Namespaces, private methods and variables within closures

by lasha

JavaScript

var foo = (function(){
 
    // Create a private variable
    var name = "Spock";
 
    // Create a private function
    var greeting = function() {
        var isThisHidden = "nested within function";
        return  { 
            name: "Hello " + name,
            hiddenVar: isThisHidden // if this isn't returned, "isThisHidden" var stays hidden/private
        };
    };
 
    // Return an object that exposes our greeting function publicly
    return {
        greeting: greeting,
        hiddenName: greeting().hiddenVar
    };
 
})();

// console.log(foo.greeting() === "Hello Spock"); // true because a reference to greeting() function is returned.
// console.log(foo.name); // undefined because "name" is private
// console.log(foo.greeting);
// console.log(foo.greeting().hiddenVar); // accesses var isThisHidden via returned hiddenVar 
console.log(foo.hiddenName); // accesses var isThisHidden because "hiddenName" executes greeting() and pulls hiddenVar.

var foo2 = {
 
    name: "Spock",
    
    lastName: function() {
        var surename = prompt("enter last name please");
        return surename;
    },
 
    greeting: function() {
        //return "Hello " + foo2.name + " " + foo2.lastName();
        return "Hello " + foo2.name;
    }
 
};
//console.log(foo2.greeting());