Javascript IE是否为每个脚本标记创建新范围?
为什么下面的html文件在IE中默认显示标题?其他浏览器将标题显示为mytitleJavascript IE是否为每个脚本标记创建新范围?,javascript,cross-browser,Javascript,Cross Browser,为什么下面的html文件在IE中默认显示标题?其他浏览器将标题显示为mytitle <script> window.mylib = window.mylib || {}; mylib.title = 'mytitle'; </script> <script> var mylib = mylib || {}; document.title = mylib.title || 'default'; </script> window.mylib=wi
<script>
window.mylib = window.mylib || {};
mylib.title = 'mytitle';
</script>
<script>
var mylib = mylib || {};
document.title = mylib.title || 'default';
</script>
window.mylib=window.mylib | |{};
mylib.title='mytitle';
var mylib=mylib | |{};
document.title=mylib.title | |“默认值”;
IE是否为每个脚本标记创建单独的作用域
这只是一个bug还是行为不同
(在IE8和最新的chrome/ff/opera中测试)
标记Javascript在窗口的范围内执行。因此,在同一范围内执行分离的脚本标记
特别是在IE7中,尝试不要在第二次重新定义变量:
而不是
var mylib = mylib || {};
使用
当遇到var mylib
时,IE7可能会覆盖mylib
的定义。您正在初始化窗口。mylib
在第一个
标记中。在第二个
标记中,您正在使用mylib
非窗口初始化var mylib
。然后对照此项检查title
的值。如果我能正确理解,似乎有一些逻辑问题
的作用域为窗口,因此只要变量或函数定义和/或初始化正确,访问变量或函数的数量和位置都无关紧要。作用域不应成为问题。每个
都应在相同的全局范围内进行评估
然而,window.mylib=…
在IE8中似乎并不被视为实际的声明。因此,在它后面加上var mylib
会导致覆盖/重置为undefined
<script>
window.mylib = {};
</script>
<script>
console.log(typeof window.mylib); // object
</script>
<script>
var mylib;
console.log(typeof window.mylib); // undefined
</script>
可能是起重故障。我想象var mylib=window.mylib | |{}代码>使您的第二个脚本按预期工作?事实上不是,但我认为它会。可能不是一个bug,而是规范中的一个差异。IE8是ECMAScript 3浏览器,而IE9+、Chrome等是ES5浏览器。“不过,我不知道ES3的什么原因会导致这种情况。”马丁,有一个好办法可以确定。如果在第二个代码段中将var mylib
重命名为var\u mylib
,代码是否有效?如果是这样的话,看起来在全局范围内重新定义mylib
(通过var
)会覆盖现有的窗口。mylib
。难道var mylib
不会被提升到最顶端,而只是提升到脚本标记的顶端吗。这将导致在第二个标记中将mylib
重新定义为undefined
。您可以尝试省略var
并检查接下来会发生什么。如果它们在IE中位于同一范围内,则mylib将与window相同。mylib否?
<script>
window.mylib = {};
</script>
<script>
console.log(typeof window.mylib); // object
</script>
<script>
var mylib;
console.log(typeof window.mylib); // undefined
</script>
<script>
var mylib = mylib || {};
mylib.title = 'mytitle';
</script>
<script>
var mylib = mylib || {};
document.title = mylib.title || 'default'; // 'mytitle'
</script>