【发布时间】:2015-10-03 20:58:03
【问题描述】:
我试图通过阅读原始规范来了解 ES6 中新的标准化块级函数。我的肤浅理解是:
- 在 ES6 中允许块级函数声明。
- 它们升到了街区的顶部。
- 在严格模式下,它们在包含块之外不可见。
但是,由于这些语义的一部分被指定为“可选”并且仅对 Web 浏览器 (Annex B) 是强制性的,这使情况变得更加复杂。所以我想填写下表:
|在块外可见? |吊起?到哪一点? | “TDZ”? | -------------------------------------------------- -------------------------------------------------- -------------------- |非严格模式,没有“网络扩展” | | | | |严格模式,没有“网络扩展” | | | | |非严格模式,带有“网络扩展 | | | | |严格模式,带有“网络扩展” | | | |我也不清楚在这种情况下“严格模式”是什么意思。 Annex B3.3 中似乎引入了这种区别,作为函数声明的运行时执行的一些额外步骤的一部分:
1. If strict is false, then
...
但是,据我所知,strict 指的是函数对象的[[Strict]] 内部插槽。这是否意味着:
// Non-strict surrounding code
{
function foo() {"use strict";}
}
应该算是上表中的“严格模式”吧?然而,这与我最初的直觉相矛盾。
请记住,我最感兴趣的是 ES6 规范本身,不管实际的实现是否不一致。
【问题讨论】:
-
请忘记“提升”这个词。在执行任何代码之前,都会处理所有函数声明。块级作用域影响标识符解析的发生方式(即与“提升”无关),在块内声明的函数可能在块外可用,也可能不可用。哦,函数声明是在变量声明之后处理的,因此它们会覆盖变量(当然,稍后对变量的赋值可以改变这一点……)。
标签: javascript ecmascript-6 language-lawyer