【问题标题】:What is the order of hoisting (function declarations vs var declarations) in JS as per modern Spec?根据现代规范,JS 中的提升顺序(函数声明与 var 声明)是什么?
【发布时间】:2020-12-25 03:44:42
【问题描述】:

Stack Overflow 上有这个答案,以支持在变量声明之前提升 JS 函数声明。它基于非常早期的 Spec 版本。

链接到答案 - Order of hoisting in JavaScript

链接到它所引用的规范 - https://www.ecma-international.org/ecma-262/5.1/#sec-10.5

推理基于第 10.5 节的步骤 8(c)

现在根据现代规范,有人可以告诉我在哪里讨论了这个提升顺序,还是说函数声明在变量声明之前提升仍然相关?

链接到当前规范 - https://www.ecma-international.org/ecma-262/11.0/index.html

【问题讨论】:

  • 来自链接主题的答案:“那个顺序真的没那么重要。”这并没有改变。
  • 呃,你已经链接了两年前的规范,而不是现在的 :-) 但是描述“提升”的部分仍然是 FunctionDeclarationInstantiation
  • 顺便说一句 tc39.es/ecma262next 规范的当前草案,而不是当前规范。我会避免链接它,因为它经常变化。
  • @Bergi 啊,好吧。您能具体告诉我 FunctionDeclarationInstantiation 的哪一部分说明了顺序吗?很抱歉我不是规范读者,但今天在经历了多个问题之后,我想深入挖掘一下。
  • 相关的步骤将是 10、14、27、36。是的,这个规范部分自 ES5.1 以来发生了很大变化,它甚至不再以相同的顺序工作 - 但是结果还是一样的:用函数声明的名字被初始化为那个函数,声明的名字没有被初始化为undefined。任何事物都无法观察到绑定创建的顺序。

标签: javascript specifications hoisting


【解决方案1】:

我认为函数 dec 与变量 dec 的提升顺序的争论没有多大关系。函数 decs 在创建阶段完全存在于内存中。只有当与 function 同名的 var 声明被赋值时,函数声明才不再有效。但是如果只有一个与函数同名的var声明,它是无效的。 (这实际上是早期规范的一部分) 根据现代规范,似乎顺序并不重要,因为 声明实际上从未上升。实际上是在执行阶段之前在内存中的那些。这就是为什么 var 先于函数或函数先于 var 声明不会产生影响。

【讨论】:

  • "函数 decs 在创建阶段完全存在于内存中" - 不完全是,函数声明是在“创建阶段”创建
  • 嘿 @Bergi 你可以忽略这个答案(这是我在我们的 js 讨论组中分享的。有人复制粘贴在这里好玩?)。是的,你是对的,那里有点错字。在创建阶段结束时,函数声明会在内存中创建。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多