【发布时间】:2023-03-09 00:07:01
【问题描述】:
var a = 0;
if (true) {
console.log(a)
a = 1;
function a() {}
a = 21
console.log(a)
}
console.log(a)
在我看来,因为函数声明提升,a = 1和a = 21会改变局部函数变量,所以块内会输出21,外面是0,但真正的结果是输出1外。
用 chrome 调试,结果是这样的
在function a() {} 上运行时,它将改变局部和全局变量。太奇怪了?
谁能给我解释一下?
【问题讨论】:
-
我怀疑这是因为Web Compatibility Semantics 在非严格模式下生效。见also。
-
@52d6c6af 是的。但是,我在您链接的答案中描述的行为不符合此处观察到的行为。因此,如果同名的上层变量已经存在,则要么与特殊大小写的 web 兼容语义有关,要么是 Chrome 中的错误。
-
Firefox 做同样的事情。 Safari 没有(第一个
console.log打印0,最后一个console.log打印21)。但我碰巧知道 Safari 中的一个错误与块中的函数声明有关。这表明这种行为可能是故意的。也许吧。
标签: javascript