ES6中不建议使用"use strict"吗?

215

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


22
ES6模块和类默认是严格模式。 - Ry-
我认为ES6默认严格模式的说法有些误导人。它们并不是真正的严格模式,许多在"use strict"下本应被捕获的事情被默默忽略了。这需要更多的说明。 - Pawel
1个回答

274

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

10.2.1 严格模式代码

ECMAScript脚本语法单元可以使用无限制或严格模式语法和语义进行处理。在以下情况下,代码将被解释为严格模式代码:

  • 如果全局代码以包含Use Strict指令的指令前言开头,则全局代码是严格模式代码(参见14.1.1)。
  • 模块代码始终是严格模式代码。
  • 类声明或类表达式的所有部分都是严格模式代码。
  • 如果Eval代码以包含Use Strict指令的指令前言开头,或者调用Eval的调用是直接Eval(参见12.3.4.1),并且包含在严格模式代码中,则Eval代码是严格模式代码。
  • 如果关联的FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、MethodDefinition或ArrowFunction位于严格模式代码中,或者产生该函数[[ECMAScriptCode]]内部槽值的代码以包含Use Strict指令的指令前言开头,则函数代码是严格模式代码。
  • 如果作为内置Function和Generator构造函数的参数提供的函数代码的最后一个参数是一个字符串,当处理该字符串时,它是以包含Use Strict指令的指令前言开头的FunctionBody,则该函数代码是严格模式代码。

13
全局代码和模块代码有什么区别?我认为我可能存在误解,因为对我来说,模块代码指的是在使用require('module')时包含在module.js文件中的所有内容。 - May Oakes
11
ES2015具有原生模块化功能,而CommonJS只是一个库,并与语言本身无关。 - Kit Sunde
20
感谢您的回复。如果它没有使用import/export关键字,那么它就不是ES6模块吗?目前我正在使用Node 4,我无法访问import/export关键字,所以我只能使用CommonJS的module.exports和require(),同时还启用了默认的ES6功能。这解释了为什么我必须在每个文件的顶部加上"use strict"。因此,从技术上讲,我仍然在使用一些启用了ES6功能的CommonJS模块在V8引擎上工作。 - May Oakes
7
要详细检查“它是一个模块吗?”,请参见https://www.nczonline.net/blog/2016/04/es6-module-loading-more-complicated-than-you-think/ 。“虽然存在import或export可能表明是一个模块,但缺少import或export并不清楚地表明该文件不是模块。因此,在解析期间没有有效的自动检测文件是否是模块的方法。” - ptim
2
“模块”到底是什么?我在一个只包含"use strict"; console.log('foo')的脚本中(使用AirBnB预设),遇到了strict错误。这算是一个模块吗? - Dan Dascalescu
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接