Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to init a global variable if it is not present?

Tags:

javascript

I load the same script in my page many times. I have some trouble on decide which is loaded first/after in my website, due to the async/load functions.

So, I'd like to put a global variable that count, when the script is loaded, the order of them.

So myScript.js will start with :

(function () {
    var privateNumberScriptLoaded;

    if (numberScriptLoaded === undefined) {
        numberScriptLoaded = 0;
    }
    else {
        numberScriptLoaded = numberScriptLoaded + 1;
    }

    privateNumberScriptLoaded = numberScriptLoaded;
    console.log(privateNumberScriptLoaded);
})();

but when I load it with :

<script src="http://www.mywebsite.com/widget/myScript.js?type=normal" type="text/javascript"></script>
<script src="http://www.mywebsite.com/widget/myScript.js?type=rotation" type="text/javascript"></script>

I get (for two times) numberScriptLoaded is not defined.

How can I resolve this trouble? In fact I'll "create" a global variable in my website if it doesnt exist. Than increment it and store in a "private" variable for each script, so I can save the order of the execution for each script.

like image 905
markzzz Avatar asked Jun 01 '12 12:06

markzzz


2 Answers

At present, your script falls prey to The Horror of Implicit Globals. I'd recommend not doing that.

You have three options:

  1. As all global variables end up as properties on window, you could use window explicitly:

    if (!window.numberScriptLoaded) {
        window.numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++window.numberScriptLoaded;
    }
    

    Unlike the code without the window. prefix, that won't throw a ReferenceError, because looking up a property on an object works differently from resolving a freestanding identifier.

    Live demo | demo page source | source of script it loads

  2. Always put var numberScriptLoaded; (with no initializer) at global scope in your script, e.g. outside your scoping function:

    var numberScriptLoaded; // No initializer (no = 0 or anything)
    

    On the first load, this will create the variable; on subsequent loads, it's a no-op. Then you can do this without a ReferenceError:

    if (!numberScriptLoaded) {
        numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++numberScriptLoaded;
    }
    

    Live demo | demo page source | source of script it loads

  3. Use typeof. If you take the typeof a variable that doesn't exist, you don't get a ReferenceError; you get "undefined". Then you can create it via the window. prefix (so you're not falling prey to The Horror).

    if (typeof numberScriptLoaded === "undefined") {
        // Assigning to window.numberScriptLoaded creates the global
        window.numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++numberScriptLoaded;
    }
    

    Live demo | demo page source | source of script it loads

like image 159
T.J. Crowder Avatar answered Oct 03 '22 08:10

T.J. Crowder


You should use typeof

if (typeof numberScriptLoaded === 'undefined') {
like image 24
xdazz Avatar answered Oct 03 '22 07:10

xdazz