好的,这让我发疯了:
第一个例子,没问题:
<script>
window.myvar = 150;
if (false) {
var myvar = 3;
}
// This will popup "150"
alert(myvar)
</script>
现在,有两个脚本元素:
<script>
window.myvar = 150;
</script>
<script>
if (false) {
var myvar = 3;
}
// This will popup "undefined"
alert(myvar)
</script>
使用IE8测试。
你知道为什么吗?
答案 0 :(得分:3)
在第二个示例中,在您的第二个script
块中,myvar
已经hoisted(根据规范)到了包含范围的顶部。记住JavaScript没有块范围,只有函数范围。
因此,当var myvar
在myvar
上查找undefined
时,alert()
(已解释的提升定义)将导致myvar
为{{1}} VariableObject
答案 1 :(得分:3)
那是因为因为javascript根据功能级别进行了范围调整,所以您的代码会计算/编译/等效于以下内容:
<script>
window.myvar = 150;
</script>
<script>
var myvar;
if (false) {
myvar = 3;
}
// This will popup "undefined"
alert(myvar)
</script>
答案 2 :(得分:2)
还有一点比Alex说的更多(尽管他只是引用了我的文章 - 谢谢!)。
如果代码序列出现在序列中,“var myVar”将不会被提升(或者它的提升将没有效果),因为“window.myvar = 150”是 首先定义(此外这不能解释为什么第一个例子有效,第二个例子在IE中失败)
看起来第二个脚本(以某种方式)在第一个脚本之前加载 - 但仅在IE8中。 您可以模拟切换标签序列,您将在所有浏览器中看到未定义的警报
var myvar;
if (false) {
myvar = 3;
}
alert(myvar)
window.myvar = 150;
答案 3 :(得分:0)
这在4.3.1的iOS Safari中没有发生,所以它可能是IE中的一个错误。但是,@ alex的回答也可能是正确的。 广告@米
答案 4 :(得分:0)
myvar
内的var myvar
)中定义if
并提升先前已知的myvar
。不过,我不确定,不管是bug还是功能。