【问题标题】:How is the 'use strict' statement interpreted in Node.js? [duplicate]Node.js 中的“use strict”语句是如何解释的? [复制]
【发布时间】:2013-08-27 08:44:11
【问题描述】:

我已经开始探索Node.js,写了很多demo web application,了解Node.js、Express.js、jade等的流程。

但我最近遇到的一件事是声明 "use strict" 作为每个函数和每个 .js 文件中的第一行。

Node.js 究竟是如何解释的?

【问题讨论】:

  • 这不是重复的......我真的不知道 JavaScript.. 以及它是否存在于 JavaScript 中。会有一些差异..对吗?所以请给一些关于node.js的理解
  • @GoloRoden 虽然我避免在文件范围内使用它,但 MDN 表示在设置 'use strict'; 文件范围时它可以按预期工作。当您将非严格文件与严格文件连接时,或者当您在 HTML 页面的内联脚本标签(Node 没有)内设置 use strict 时,就会出现问题。
  • 没错。然而,Web 浏览器和 Node.js 之间还是有区别的:在一种情况下你应该考虑它,在另一种情况下你不需要。 (顺便说一句,我关于讽刺的评论与你无关)
  • 正如您已经说过的:连接所有脚本文件时可能会出现问题。因此,我认为这是不行的,并且根据经验,建议您始终将代码包装在立即执行的函数中(无论如何,对于其他各种原因)。在 Node.js 中,这根本不是必需的。
  • 我不确定这是不是重复的。这个问题有助于我理解 node.js 使用与 Chrome 浏览器相同的引擎进行解释。没有这些知识,就无法明确如何应用“使用严格”。

标签: javascript node.js use-strict


【解决方案1】:

"use strict";

基本上它启用了严格模式。

严格模式是一种允许您将程序或函数置于“严格”操作环境中的功能。在严格的操作上下文中,方法形式像以前一样将 this 绑定到对象。函数形式将 this 绑定到 undefined,而不是全局 set 对象。

根据您的 cmets,您说会有一些差异。但这是你的假设。 Node.js 代码不过是您的 JavaScript 代码。所有 Node.js 代码都由 V8 JavaScript engine 解释。 V8 JavaScript 引擎是谷歌为 Chrome 网络浏览器开发的开源 JavaScript 引擎。

因此,Chrome 浏览器和 Node.js 对 "use strict"; 的解释方式并没有太大区别。

请阅读 JavaScript 中的严格模式。

更多信息:

  1. Strict mode
  2. ECMAScript 5 Strict mode support in browsers
  3. Strict mode is coming to town
  4. Compatibility table for strict mode
  5. Stack Overflow questions: what does 'use strict' do in JavaScript & what is the reasoning behind it


ECMAScript 6:

ECMAScript 6 代码和严格模式。以下是简短的from the specification

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。

此外,如果您不知道当前版本的 Node.js 支持哪些功能,此 node.green 可以为您提供帮助(利用与 kangax 相同的数据)。

【讨论】:

  • 首先,Chrome 并不是地球上唯一的浏览器。只是 Node.js 和 Chrome 使用 V8,并不一定意味着它在所有浏览器中的工作方式都相同。其次,加载文件(也称为模块)的方式有所不同。第三,浏览器的脚本通常会连接起来以供生产使用,当您说两者是相同的环境时,可能会出现问题。他们不是。在执行 Node.js 文件时,V8 并不是唯一重要的事情。
  • @GabrielLlamas:谢谢。 @Golo Roden:是的,如果评论得当的话。我们可以给出更多更好的答案。
  • @AmolMKulkarni :“模块代码始终是严格模式代码”——对于 Node 来说,完全正确。如果您在节点 v.6.10.2 中使用“use strict”,则以下代码将抛出错误:var obj = {}; Object.preventExtensions(obj); obj.a=1;
  • @fider:虽然你的问题对我来说不是很清楚。如果与此问题相关,您可以考虑提出一个新问题或继续在评论中解释。在此之前看看这个link如果你能找到答案
  • 我认为 Node.js 不包含完整的 Ecmascript 6 模块(默认支持严格模式),请参阅此处有用的文章(讨论在 Javascript/Node.js 中使用严格模式)=> @987654331 @
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2013-08-11
  • 2013-02-26
  • 2020-12-07
  • 1970-01-01
  • 2021-12-29
  • 2013-06-13
相关资源
最近更新 更多