你见过这种奇怪的IE JavaScript行为/ bug吗?

时间:2011-07-05 10:59:42

标签: javascript internet-explorer

好的,这让我发疯了:

第一个例子,没问题:

<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测试。

你知道为什么吗?

5 个答案:

答案 0 :(得分:3)

在第二个示例中,在您的第二个script块中,myvar已经hoisted(根据规范)到了包含范围的顶部。记住JavaScript没有块范围,只有函数范围。

因此,当var myvarmyvar上查找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还是功能。