我多次在我的页面中加载相同的脚本.由于异步/加载功能,我在决定在我的网站中首先加载哪个加载时遇到一些麻烦.
所以,我想在加载脚本时添加一个全局变量来计算它们的顺序.
所以myScript.js将从以下开始:
(function () {
var privateNumberScriptLoaded;
if (numberScriptLoaded === undefined) {
numberScriptLoaded = 0;
}
else {
numberScriptLoaded = numberScriptLoaded + 1;
}
privateNumberScriptLoaded = numberScriptLoaded;
console.log(privateNumberScriptLoaded);
})();
Run Code Online (Sandbox Code Playgroud)
但当我加载它时:
<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>
Run Code Online (Sandbox Code Playgroud)
我得到(两次)numberScriptLoaded is not defined.
我该如何解决这个问题呢?事实上,如果它不存在,我将在我的网站中"创建"一个全局变量.然后增加它并存储在每个脚本的"私有"变量中,这样我就可以保存每个脚本的执行顺序.
目前,你的剧本成为暗杀全球恐怖的牺牲品.我建议不要这样做.
你有三个选择:
由于所有全局变量最终都是属性window,因此您可以window明确使用:
if (!window.numberScriptLoaded) {
window.numberScriptLoaded = 1; // 1, not 0
}
else {
++window.numberScriptLoaded;
}
Run Code Online (Sandbox Code Playgroud)
与没有window.前缀的代码不同,它不会抛出ReferenceError,因为在对象上查找属性与解析独立标识符的工作方式不同.
始终将var numberScriptLoaded;(没有初始化程序)放在脚本的全局范围内,例如在作用域范围之外:
var numberScriptLoaded; // No initializer (no = 0 or anything)
Run Code Online (Sandbox Code Playgroud)
在第一次加载时,这将创建变量; 在后续加载中,它是一个无操作.那么你可以在没有ReferenceError:
if (!numberScriptLoaded) {
numberScriptLoaded = 1; // 1, not 0
}
else {
++numberScriptLoaded;
}
Run Code Online (Sandbox Code Playgroud)
使用typeof.如果你拿typeof一个不存在的变量,你就得不到了ReferenceError; 你得到"undefined".然后你可以通过window.前缀创建它(所以你不会成为恐怖的牺牲品).
if (typeof numberScriptLoaded === "undefined") {
// Assigning to window.numberScriptLoaded creates the global
window.numberScriptLoaded = 1; // 1, not 0
}
else {
++numberScriptLoaded;
}
Run Code Online (Sandbox Code Playgroud)