aimingoo / js-green-book-3

本书基于ES6,并涵盖最新的ECMAScript 2019规范,全面讲述JavaScript在五个方面的语言特性,以及将这些特性融会如一的方法。
126 stars 15 forks source link

【勘误】“4.3.3 顶层声明”小节勘误 #3

Open aimingoo opened 3 years ago

aimingoo commented 3 years ago

P298 第二段

按照JavaScript的传统语法,...在“变量提升”效果的影响下,代码行4将输出“undefined, undefined”。 改为 按照JavaScript的传统语法,...在“变量提升”效果的影响下,代码行4将输出“[function x], [function y]”。

NOTE:早期JavaScript中,函数内所有var/function声明都将提升到函数顶层声明。因此这两个函数声明将出现在顶层并绑定了它们的值;如果是var声明,则提升而不绑定值,这种情况下才会是“undefined, undefined”。

P298 第三段

而在ES6之后,ECMAScript约定了块级作用域,这里的顶层变量的计算就不一样了。 改为 然而在ES5之后的一些部分实现了(早期未被规范的)块级作用域的引擎中,这里的顶层变量计算就开始变得不一样了。

而到了第11行,... 因此输出“[function x], outer”。 改为 而到了第11行,...因此就应该输出“[function x], outer”。

NOTE:这里块级作用域是指firefox的早期实现/实践。在实现“条件声明语句”这项特性时,firefox引入了类似于此的、未被规范的概念。这里主要强调“条件声明语句”的早期作用主要是动态的、条件化地添加一个新的变量名。——所以外部的变量x/y将是动态覆盖的。

P298 第四段

考虑到对传统JavaScript语法的兼容,ECMAScript接受了这里的var声明(以及函数声明),但同时为了避免…… 改为 考虑到对传统JavaScript语法的部分兼容,ECMAScript接受了这里的var声明,但不再支持“非顶层”的函数声明,同时为了避免……

NOTE:这里是本小节所述中的一个关键错误。ES6及之后的规范中,var声明仍然是跨块作用域而提升到函数/全局的,但函数声明却不再做这样的提升。——亦即是说,后者(函数声明)中,顶层的函数声明仍然支持”在声明之前使用“,但非顶层的函数声明将只在它所在的块级作用域中有效(而不再提升到外层的块)。但是,后文中的”补充标准“将使得Web浏览器(以及支持该补充标准的引擎,例如Node.js)能够兼容旧设计,从而实现”条件声明语句“,以及”块级作用域中的函数声明“等扩展特性。

P298 第五段

在ES6之后, 改为 因此在ES6之后,

NOTE:由于ES6是晚于firefox对上述“条件声明语句”的实现的,因此这一补充标准主要的目的是WEB兼容。

P299 第一段

对于不支持该补充标准的引擎来说,上述语法都不会产生顶层变量。因此——如果你可以…… 改为 对于不支持该补充标准的引擎来说,上述语法都不会产生顶层变量。这也意味着这样的(块级的或条件语句中的)声明语句只对所在块有效,而不会覆盖其外层声明。因此——如果你可以……

NOTE:由于本书并不侧重讨论扩展标准,因此下面的内容都将是那些”不支持“扩展规范的引擎的效果。——而这在大多数引擎上都无法重现,因此除了这里的强调之外,还会在脚注中再添加一点说明。

P299 脚注1

……因此下面的例子在Node.js中的执行效果会不同。 改为 ……因此下面的例子在Node.js中的执行效果会有不同(后续两个示例可以在prepack-core中得到验证)。