当严格模式关闭时,功能的提升行为是否不同?[复制]

Does hoisting of functions behave differently when strict mode is off? [duplicate]

提问人:Alexandr 提问时间:11/2/2023 最后编辑:Alexandr 更新时间:11/3/2023 访问量:50

问:

这里有两个类似的代码,除了“使用严格”部分

    "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,但由于某种原因,如果没有严格模式,它就无法正常工作?

可能它与使用第一个函数范围限定的那些 {} 有关,但我不太确定

JavaScript 作用域 函数声明 严格模式

评论


答:

-1赞 Quentin #1

tl;dr:在非严格模式下,在 JS 引擎之前,对块中函数声明的处理是不一致的。别这样。

来自 MDN

块范围的函数声明

JavaScript 语言规范从一开始就没有 允许嵌套在块语句中的函数声明。但是,它 非常直观,以至于大多数浏览器都将其作为扩展实现 语法。不幸的是,实现的语义存在分歧,并且 语言规范不可能协调所有 实现。因此,块范围的函数声明仅在严格模式下显式指定(而它们曾经 在严格模式下不允许),而马虎模式行为仍然存在 浏览器之间的差异。

评论

0赞 Bergi 11/2/2023
你引用的 MDN 页面似乎已经有一段时间没有更新了。未指定草率模式行为是错误的,引擎之间保持差异是错误的。