【问题标题】:Not recommended to use "use strict" in ES6?不建议在 ES6 中使用“use strict”?
【发布时间】:2015-10-19 12:54:04
【问题描述】:

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

【问题讨论】:

标签: javascript ecmascript-6 strict es6-modules


【解决方案1】:

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

10.2.1 严格模式代码

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

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

【讨论】:

  • 全局代码和模块代码有什么区别?我想我误解了,因为模块代码对我来说意味着 module.js 中的所有内容,如果我需要('module')。
  • @BrynnMahsman ES2015 有原生模块。 CommonJS 只是一个库,与语言无关。
  • 感谢您的回复。那么如果不使用 import/export 关键字,它不是 ES6 模块吗?现在我使用的是 Node 4,我无法访问 import/export 关键字,我只是使用 CommonJS module.exports 和 require() 以及默认启用的 ES6 功能。它可以解释为什么我必须将 use strict 放在每个文件的顶部。所以从技术上讲,我仍在编写 CommonJS 模块,并在 V8 中启用了一些 ES6 功能?
  • 要详细检查“它是一个模块吗?”,请参阅nczonline.net/blog/2016/04/… “...而导入或导出的存在可能表明一个模块,缺少导入或导出并不能清楚地表明该文件不是模块。因此在解析过程中没有有效的方法来自动检测文件是模块。”
  • 究竟什么是“模块”?我在仅包含"use strict"; console.log('foo') 的脚本上收到strict 错误(带有the AirBnB preset)。那是一个模块吗?
猜你喜欢
  • 2012-02-15
  • 2023-03-10
  • 1970-01-01
  • 2011-07-10
  • 2016-08-20
  • 2016-07-11
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多