提问人:Alexandr 提问时间:11/2/2023 最后编辑:Alexandr 更新时间:11/3/2023 访问量:50
当严格模式关闭时,功能的提升行为是否不同?[复制]
Does hoisting of functions behave differently when strict mode is off? [duplicate]
问:
这里有两个类似的代码,除了“使用严格”部分
"use strict"
{ function a() {
return 1;
}
}
function a() {
return 2;
}
console.log(a());
在本例中,console 返回 2,因为据我所知,在严格模式下,函数的作用域是其最近的封闭块,因此调用 a() 将触发在全局作用域中定义的函数 但是当我尝试在不打开严格模式的情况下执行相同的代码时,它将产生完全不同的输出,即 1
{ function a() {
return 1;
}
}
function a() {
return 2;
}
console.log(a());
我想知道为什么因为我期望控制台仍然返回 2,因为我认为在非严格模式下函数的范围不限于它们的封闭块,因此具有相同名称的第二个函数声明将覆盖前一个声明,最终我们仍然会得到 2,但由于某种原因,如果没有严格模式,它就无法正常工作?
可能它与使用第一个函数范围限定的那些 {} 有关,但我不太确定
答:
-1赞
Quentin
#1
tl;dr:在非严格模式下,在 JS 引擎之前,对块中函数声明的处理是不一致的。别这样。
来自 MDN:
块范围的函数声明
JavaScript 语言规范从一开始就没有 允许嵌套在块语句中的函数声明。但是,它 非常直观,以至于大多数浏览器都将其作为扩展实现 语法。不幸的是,实现的语义存在分歧,并且 语言规范不可能协调所有 实现。因此,块范围的函数声明仅在严格模式下显式指定(而它们曾经 在严格模式下不允许),而马虎模式行为仍然存在 浏览器之间的差异。
评论
0赞
Bergi
11/2/2023
你引用的 MDN 页面似乎已经有一段时间没有更新了。未指定草率模式行为是错误的,引擎之间保持差异是错误的。
评论