如果不存在,如何初始化全局变量?

时间:2012-06-01 12:45:08

标签: javascript

我多次在页面中加载相同的脚本。由于异步/加载功能,我在决定在我的网站中首先加载哪个加载时遇到一些麻烦。

所以,我想在加载脚本时设置一个全局变量来计算它们的顺序。

所以myScript.js将从以下开始:

(function () {
    var privateNumberScriptLoaded;

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

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

但当我加载时:

<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>

我得到(两次)numberScriptLoaded is not defined

我该如何解决这个问题?事实上,如果它不存在,我将在我的网站中“创建”一个全局变量。然后增加它并存储在每个脚本的“私有”变量中,这样我就可以保存每个脚本的执行顺序。

7 个答案:

答案 0 :(得分:9)

目前,您的脚本会成为The Horror of Implicit Globals的牺牲品。我建议不要这样做。

您有三种选择:

  1. 由于所有全局变量都以window上的属性结尾,因此您可以明确使用window

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

    与没有window.前缀的代码不同,它不会抛出ReferenceError,因为在对象上查找属性与解析独立标识符的工作方式不同。

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

  2. 始终将var numberScriptLoaded;(没有初始值设定项)放在脚本的全局范围内,例如在你的范围界定之外:

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

    在第一次加载时,这将创建变量;在后续加载中,它是一个无操作。然后,您可以在没有ReferenceError

    的情况下执行此操作
    if (!numberScriptLoaded) {
        numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++numberScriptLoaded;
    }
    

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

  3. 使用typeof。如果您将typeof变量设为不存在,则不会得到ReferenceError;你得到"undefined"。然后你可以通过window.前缀创建它(这样你就不会成为 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

答案 1 :(得分:4)

您应该使用typeof

if (typeof numberScriptLoaded === 'undefined') {

答案 2 :(得分:2)

尝试

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

答案 3 :(得分:1)

myGlobalVar = typeof myGlobalVar == "undefined"? "New Value" : myGlobalVar;
myGlobalVar = typeof myGlobalVar == "undefined"? "Totally New Value" : myGlobalVar;
alert(myGlobalVar);

http://jsfiddle.net/8gnuwaah/2/

答案 4 :(得分:0)

全局变量是window对象的直接属性。因此,如果您想从任何地方初始化全局变量,只需键入:

window.variableName = "what_ever_you_want"

答案 5 :(得分:0)

作为最佳做法并且为了防止此类错误,所有变量都应在用于脚本之前进行初始化。

你应该把:

var numberScriptLoaded;

在关闭之前,错误不会发生。

答案 6 :(得分:0)

如果您要使用window存储全局,那么您可以在一行中执行以下操作:

window.numberScriptLoaded  = (window.numberScriptLoaded  || 0) + 1