我多次在页面中加载相同的脚本。由于异步/加载功能,我在决定在我的网站中首先加载哪个加载时遇到一些麻烦。
所以,我想在加载脚本时设置一个全局变量来计算它们的顺序。
所以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
。
我该如何解决这个问题?事实上,如果它不存在,我将在我的网站中“创建”一个全局变量。然后增加它并存储在每个脚本的“私有”变量中,这样我就可以保存每个脚本的执行顺序。
答案 0 :(得分:9)
目前,您的脚本会成为The Horror of Implicit Globals的牺牲品。我建议不要这样做。
您有三种选择:
由于所有全局变量都以window
上的属性结尾,因此您可以明确使用window
:
if (!window.numberScriptLoaded) {
window.numberScriptLoaded = 1; // 1, not 0
}
else {
++window.numberScriptLoaded;
}
与没有window.
前缀的代码不同,它不会抛出ReferenceError
,因为在对象上查找属性与解析独立标识符的工作方式不同。
始终将var numberScriptLoaded;
(没有初始值设定项)放在脚本的全局范围内,例如在你的范围界定之外:
var numberScriptLoaded; // No initializer (no = 0 or anything)
在第一次加载时,这将创建变量;在后续加载中,它是一个无操作。然后,您可以在没有ReferenceError
:
if (!numberScriptLoaded) {
numberScriptLoaded = 1; // 1, not 0
}
else {
++numberScriptLoaded;
}
使用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;
}
答案 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);
答案 4 :(得分:0)
全局变量是window
对象的直接属性。因此,如果您想从任何地方初始化全局变量,只需键入:
window.variableName = "what_ever_you_want"
答案 5 :(得分:0)
作为最佳做法并且为了防止此类错误,所有变量都应在用于脚本之前进行初始化。
你应该把:
var numberScriptLoaded;
在关闭之前,错误不会发生。
答案 6 :(得分:0)
如果您要使用window
存储全局,那么您可以在一行中执行以下操作:
window.numberScriptLoaded = (window.numberScriptLoaded || 0) + 1