不建议在ES6中使用“严格使用”吗?


200

我对ECMAScript 6还不熟悉。我刚刚克隆了React Starter Kit仓库,该仓库使用ES6作为应用程序代码。我惊讶地发现linter被配置为禁止出现该use strict指令,我认为这是ES6之前的JavaScript中推荐的。那有什么意义呢?



Answers:


257

ES6模块始终处于严格模式。引用规范的相关部分:

10.2.1严格模式代码

可以使用非受限或严格模式的语法和语义来处理ECMAScript脚本语法单元。在以下情况下,代码被解释为严格模式代码:

  • 如果全局代码以包含使用严格指令的指令序言开头(请参见14.1.1),则它是严格模式代码。
  • 模块代码始终是严格模式代码。
  • ClassDeclaration或ClassExpression的所有部分都是严格模式代码。
  • 如果Eval代码以包含使用严格指令的指令序言开头,或者如果eval的调用是包含在严格模式代码中的直接eval(请参阅12.3.4.1),则它是严格模式代码。
  • 如果在严格模式代码中包含关联的FunctionDeclaration,FunctionExpression,GeneratorDeclaration,GeneratorExpression,MethodDefinition或ArrowFunction,或者如果产生该函数的[[ECMAScriptCode]]内部插槽值的代码以伪指令开头,则功能代码为严格模式代码。包含“使用严格”指令。
  • 如果最后一个参数是一个字符串,则该函数代码作为内置函数和生成器构造函数的参数提供给函数代码,该字符串在处理时是一个以包含使用严格指令的指令序言开头的FunctionBody。

11
全局代码和模块代码有什么区别?我想我误会了,因为如果需要,模块代码对我来说意味着module.js中的所有内容。
May Oakes 2015年

8
@BrynnMahsman ES2015具有本机模块。CommonJS只是一个库,与语言无关。
Kit Sunde 2015年

18
感谢您的答复。如果它不使用import / export关键字,那么它不是ES6模块吗?现在,我正在使用节点4,并且无权访问import / export关键字,而仅使用CommonJS module.exports和require()以及默认启用的ES6功能。这可以解释为什么我必须在每个文件的开头都使用严格。因此,从技术上讲,我仍在编写具有V8中启用的ES6功能的CommonJS模块?
May Oakes

7
有关“是否是模块”的详细检查,,请参阅nczonline.net/blog/2016/04/… “ ...虽然导入或导出的存在可能表示一个模块,但是缺少导入或导出并不能清楚地表明该文件不是模块。因此在解析过程中没有有效的方法来自动检测文件是模块。”
ptim

1
什么是“模块”?我在仅包含的脚本上收到strict错误(带有AirBnB预设"use strict"; console.log('foo')。那是一个模块吗?
Dan Dascalescu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.