什么是扩展模式?

时间:2013-06-22 17:38:44

标签: javascript ecmascript-6

我在Node v0.10.12中使用let玩弄。使用--harmony标志,以下代码会产生语法错误:

for (let i = 0; i < 2; i += 1) {
    console.log('i', i);
}
  

SyntaxError:非法让扩展模式外的声明

但是,如果我也使用--use-strict标志,那么代码将按预期运行。

为什么仅使用--harmony标志时会抛出语法错误?什么是扩展模式?与严格模式有什么联系?

2 个答案:

答案 0 :(得分:15)

2012年2月27日看来,“扩展模式”已从和谐规范的current development version中删除了,但有一些旧版本的描述(这一个是来自2012年1月16日):

  

10.1.2扩展代码

     

扩展代码是ECMAScript程序语法中包含的任何代码   包含词汇或句法产生的单位   在第五版ECMAScript之后定义   规格。代码在下面被解释为扩展代码   情况:

     
      
  • 全局代码是扩展的全局代码,如果它包含在ECMAScript程序语法单元中,该语法单元已被指定为   扩展的程序单元,以实现定义的方式或如果???。

  •   
  • 如果对eval的调用是对包含在的eval函数的直接调用(参见15.1.2.1.1),则Eval代码是扩展的eval代码   扩展模式代码或者如果它以???开头。

  •   
  • 作为 FunctionDeclaration FunctionExpression 或访问者 PropertyAssignment 的一部分的功能代码是扩展功能代码,如果其 FunctionDeclaration FunctionExpression ,或    PropertyAssignment 包含在扩展模式代码中,或者如果功能代码以???开头。

  •   
  • 作为内置Function构造函数的最后一个参数提供的函数代码是严格的函数代码,如果最后一个参数是   处理为 FunctionBody 时的字符串以???。

  • 开头   
     

术语“严格代码”用于指定实际的严格模式   代码和扩展代码,而术语“扩展代码”仅指定   实际的扩展代码。术语“基本代码”用于指定代码   这不是扩展代码。

对于与严格模式的连接,这似乎是特定于V8(实验)实现。以下是引入--harmony标志的changelog for revision 10062所说的内容:

  

这个CL引入了非严格旁边的第三种模式(此后   称为“经典模式”)和“严格模式”,称为“扩展模式”   模式'在当前的ES.next规范草案中。扩展   mode基于'严格模式'并为其添加新功能。   这意味着这两种模式的大多数语义都是一致的。

     

在此期间输入'扩展模式'而不是'严格模式'   解析时使用'严格模式'指令“use strict”和何时使用   和谐范围标志处于活动状态。 一旦发生这种情况就应该更改   完全指定了如何输入'扩展模式'。

答案 1 :(得分:10)

How to obtain harmony in your node.js

--harmony标志启用ES Harmony features。似乎--harmony在语言中启用了新的ECMA功能,基于v8,代理,弱映射,集合,映射,类型语义和块作用域在使用此标志时可用是扩展功能,在扩展这些功能之后,您可以使用例如let(用于块范围),仅启用strict mode,因为它基于它,否则它将抛出

  

SyntaxError:非法让扩展模式外的声明。

扩展模式:当您使用新的ECMA功能(ECMAScript 5)时,您处于语言的扩展模式,并且在此模式下ECMAScript的新功能(扩展代码)和语法只能在strict mode

中使用
  

“扩展代码”的概念,意味着可能使用新的Es.next的代码   语法。

Harmony

  

“Harmony”是由于到2013年底到期而对JavaScript进行重大升级的名称。2008年,经过多次争议,ECMA技术委员会39,负责创建下一代JavaScript,同意共同致力于JavaScript的“Harmony”更新,从那时起它一直在开发中。   Google的实施支持A number of the proposed features和谐。这些包括块作用域绑定和 let 关键字的添加,高效的映射和集合,以消除“滥用对象作为字典”的需要,垃圾收集键/值表的弱映射和可以模拟的代理任何启用自定义的JavaScript对象或函数。

一些好的读物herehear。也来自Chromium Blog

同样来自Paul Irish

  

François Beaufort(最初共享):名为Enable的新标志   实验JavaScript出现在chrome:// flags页面中   最后的Chromium版本。此标志使网页可以使用实验   JavaScript功能。

要在Chrome中使用扩展模式/和声功能,我们必须启用此功能,我们可以通过导航到chrome://flags启用此功能,并可以在“实验性JavaScript功能”上切换(启用/禁用)。