5

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

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

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

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

4

7 回答 7

10

目前,您的脚本成为隐式全局恐怖的牺牲品。我建议不要这样做。

你有三个选择:

  1. 由于所有全局变量最终都作为属性 on window,您可以window显式使用:

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

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

    现场演示| 演示页面源| 它加载的脚本来源

  2. 始终将var numberScriptLoaded;(没有初始化程序)放在脚本中的全局范围内,例如在您的范围函数之外:

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

    在第一次加载时,这将创建变量;在随后的加载中,这是一个空操作。然后你可以做到这一点没有ReferenceError

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

    现场演示| 演示页面源| 它加载的脚本来源

  3. 使用typeof. 如果您采用typeof不存在的 a 变量,则不会得到 a ReferenceError; 你明白了"undefined"。然后你可以通过前缀创建它(这样你就不会成为The Horror 的window.牺牲品)。

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

    现场演示| 演示页面源| 它加载的脚本来源

于 2012-06-01T13:15:04.093 回答
4

你应该使用typeof

if (typeof numberScriptLoaded === 'undefined') {
于 2012-06-01T12:47:37.477 回答
2

尝试

if ( 'undefined' === typeof numberScriptLoaded ) {
    numberScriptLoaded = 0;
} else {
    numberScriptLoaded = numberScriptLoaded + 1;
}
于 2012-06-01T12:48:10.813 回答
1
myGlobalVar = typeof myGlobalVar == "undefined"? "New Value" : myGlobalVar;
myGlobalVar = typeof myGlobalVar == "undefined"? "Totally New Value" : myGlobalVar;
alert(myGlobalVar);

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

于 2015-11-18T23:07:22.163 回答
0

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

window.variableName = "what_ever_you_want"
于 2012-06-01T12:50:13.850 回答
0

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

你应该把:

var numberScriptLoaded;

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

于 2012-06-01T12:55:33.960 回答
0

如果您打算使用window来存储全局,那么您可以在一行中完成:

window.numberScriptLoaded  = (window.numberScriptLoaded  || 0) + 1
于 2018-01-09T11:15:28.863 回答