我正在let
玩 Node v0.10.12。使用该--harmony
标志,以下代码会产生语法错误:
for (let i = 0; i < 2; i += 1) {
console.log('i', i);
}
SyntaxError:扩展模式外的非法 let 声明
但是,如果我也使用该--use-strict
标志,那么代码将按预期运行。
为什么只使用--harmony
标志时会引发语法错误?什么是扩展模式?与严格模式有什么关系?
我正在let
玩 Node v0.10.12。使用该--harmony
标志,以下代码会产生语法错误:
for (let i = 0; i < 2; i += 1) {
console.log('i', i);
}
SyntaxError:扩展模式外的非法 let 声明
但是,如果我也使用该--use-strict
标志,那么代码将按预期运行。
为什么只使用--harmony
标志时会引发语法错误?什么是扩展模式?与严格模式有什么关系?
看起来“扩展模式”已于 2012 年 2 月 27 日从和谐规范的当前开发版本中删除,但在一些较旧的版本中描述了它应该是什么(这是从 2012 年 1 月 16 日开始的) :
10.1.2 扩展代码
扩展代码是包含在 ECMAScript 程序句法单元中的任何代码,其中包含在 ECMAScript 规范第五版之后定义的词汇或句法产生的出现。在以下情况下,代码被解释为扩展代码:
如果全局代码包含在已以实现定义的方式指定为扩展程序单元的 ECMAScript 程序句法单元中,或者如果 ???,则全局代码是扩展全局代码。
如果对 eval 的调用是对包含在扩展模式代码中的 eval 函数的直接调用(参见 15.1.2.1.1),或者如果它以 ??? 开头,则 Eval 代码是扩展的 eval 代码。
如果FunctionDeclaration、FunctionExpression或 PropertyAssignment包含在扩展模式代码中,或者如果函数代码以 ??? 开头,则作为FunctionDeclaration、FunctionExpression或访问器PropertyAssignment一部分的函数代码是扩展函数代码。
如果最后一个参数是作为FunctionBody处理时以 ??? 开头的字符串,则作为内置 Function 构造函数的最后一个参数提供的函数代码是严格函数代码。
术语“严格代码”用于指定实际的严格模式代码和扩展代码,而术语“扩展代码”仅指定实际扩展代码。术语“基本代码”用于指定不是扩展代码的代码。
至于与严格模式的连接,这似乎特定于 V8 的(实验)实现。这是引入标志的修订版 10062 的变更日志的内容:--harmony
此 CL 在非严格模式(以下称为“经典模式”)和“严格模式”(在当前 ES.next 规范草案中称为“扩展模式”)旁边引入了第三种模式。扩展模式基于“严格模式”并为其添加了新功能。这意味着这两种模式的大部分语义是一致的。
当使用“严格模式”指令“使用严格”并且和谐范围标志处于活动状态时,在解析期间输入“扩展模式”而不是“严格模式”。 一旦完全指定如何进入“扩展模式”,就应该改变它。
该--harmony
标志启用ES Harmony 功能。似乎--harmony
启用了该语言中的新 ECMA 功能,基于v8
代理、弱映射、集合、映射、typeof 语义和块作用域,当使用此标志时,这些是扩展功能,在扩展这些功能后,您可以使用例如let
(用于块范围)strict mode
仅因为它基于它,否则它会抛出
SyntaxError: 扩展模式外的非法 let 声明。
扩展模式:当您使用新ECMA
功能(ECMAScript 5)时,您处于语言的扩展模式,在此模式下,ECMAScript 的新功能(扩展代码)和语法只能在严格模式下使用
“扩展代码”的概念,意味着可以使用新的 Es.next 语法的代码。
和谐:
“Harmony”是 JavaScript 重大升级的名称,预计将于 2013 年底到来。2008 年,经过多次争论,负责创建下一代 JavaScript 的 ECMA 技术委员会 39 同意合作关于 JavaScript 的“Harmony”更新,从那时起它一直在开发中。 Google 的实施支持许多建议的 Harmony 功能。其中包括块范围绑定和添加let关键字、高效的映射和集合以消除“滥用对象作为字典”的需要、用于垃圾可收集键/值表的弱映射和可以模拟任何 JavaScript 对象或函数以启用的代理定制。
一些很好的阅读和聆听。同样来自Chromium 博客。
同样来自保罗爱尔兰人:
François Beaufort(最初共享):一个名为 Enable Experimental JavaScript 的新标志出现在最后一个 Chromium 构建的 chrome://flags 页面中。此标志使网页能够使用实验性 JavaScript 功能。
要现在使用扩展模式/和谐功能,Chrome
我们必须启用它,我们可以通过导航到chrome://flags
“Experimental JavaScript features”并切换(启用/禁用)来启用它。