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

javascript

Solution

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

You have three options:

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

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

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

Problem

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.

Original source