我的代码类似于以下内容:
<script src="library.js"></script><!-- loads window.lib and lib.subLib -->
<script>
if (!window.lib) { alert("foo") }; //Triggers, despite library.js being loaded fine
lib.custLib = function(b) { ... }(lib.subLib); //Works fine, even though IE JUST said that window.lib wasn't loaded
</script>
只是为了让事情变得更加疯狂,在页面加载后,如果我输入
javascript:if(window.lib)alert("foo");
进入位置栏,警报触发,指示window.lib已加载。如果我输入
javascript:if(!window.lib)alert("foo");
警报不会触发,确认!window.lib不会评估为真。
我可以得出的唯一结论是,当我第一次检查window.lib是否存在以及在函数声明之后立即在立即调用中实际使用lib.subLib时,某种程度上,library.js正在完成执行。
编辑:其他信息......
我找到了一种解决方法,但首先要注意一些有趣的事情。
<script src="library.js"></script><!-- loads window.lib and lib.subLib -->
<script>
alert(!window.lib) //True
if (!window.lib) {
alert(!window.lib) //True
}
</script>
比较:
<script src="library.js"></script><!-- loads window.lib and lib.subLib -->
<script>
alert(!window.lib) //False
</script>
<script>
if (!window.lib) {
alert(!window.lib) //True
}
</script>
解决方法:
<script src="library.js"></script><!-- loads window.lib and lib.subLib -->
<script>
var foo = !window.lib;
</script>
<script>
if (foo) {
alert(!window.lib) //Doesn't get triggered
}
</script>
总而言之,这似乎是Internet Explorer中的一个错误。解决方法是使用单独的脚本块将变量设置为!window.lib的值,然后在下一个脚本块中检查该变量,而不是直接检查!window.lib。