understanding the javascript global namespace and closures

  1. Is there a god (i.e. a parent) object?

    Yes. More technically, it’s the global object that all these primitives are members of; it just happens that in the browser, the window object is the global object.

    > window.String === String;
    true
    
  2. Why is it bad idea to have vars/functions on a global level?

    Because if you’re adding lots of 3rd party libraries/ scripts, they all share the same global object, there’s the chance of name collisions. This is a real life problem with all the libraries which use $ as an alias (jQuery, Prototype and more).

  3. If it is really a bad idea to have vars/functions in global scope then would closures be the best way to avoid this?

    x shouldn’t be considered global. It’s part of the closure formed by declaring the child functions inside the parent() function. The problem part of your snippet is that parent() is global; what happens if some other code re-declared parent()? This would be better:

    (function () {
    
    function parent(){
        var x = 'some value';
        function child1(){
            x.someMethod()
        } 
        function child2(){
            x*something;
        }
        function child3(){
            x+=something;
            child2()
            child1()
        }
        child3()
    }
    parent()
    
    }());
    

    The fact x is accessible within the child functions isn’t bad; you should have written those functions yourself, so you should be aware of the existence of x. Bear in mind that if you re-declare x within those child functions with var, you won’t affect the x in parent().

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)