How is the 'use strict' statement interpreted in Node.js?
我已经开始探索node.js,编写了很多演示Web应用程序,了解node.js、express.js、jade等的流程。
但最近我遇到的一件事是,在每个函数和每个.js文件中,语句"use strict"作为第一行。
node.js如何解释它?
- 函数的任何语句之前的'use strict';字符串将使其处于严格模式。
- 你读过这个吗?:developer.mozilla.org/en-us/docs/web/javascript/reference/…
- 这不是重复的…我真的不知道JavaScript……如果它存在于javascript中。会有一些不同。正确的?所以,请您对node.js有一些了解
- 相关:node --strict_mode server.js。
- 您看到的文件可能也有一个.js扩展名。这就是节点运行的语言(它的JS解释器是V8)。
- 是的,尽管node.js是javascript,但是在如何使用严格模式上有一个细微的区别:在node.js中,在立即执行的函数之外,在浏览器中启用文件范围是没有问题的,这是不可行的。所以,至少我不需要讽刺。
- @尽管我不在文件范围内使用它,但MDN说它在设置'use strict';文件范围时按预期工作。如果将非严格文件与严格文件连接起来,或者在HTML页面的内联脚本标记(该节点没有)内设置use strict,就会出现问题。
- 确切地。然而,Web浏览器和node.js之间存在着差异:在一个场景中,您应该考虑它,而在另一个场景中,您不需要考虑它。(我对讽刺的评论与你无关,顺便说一句)
- @戈洛登:这是禁止通行证吗?chrome的行为与这里的节点完全相同。
- 正如您已经说过的:当您连接所有脚本文件时,可能会出现问题。因此,我认为这是一种不可行的做法,并且——按照经验法则——建议您总是将代码包装在一个立即执行的函数中(这是一个好主意,不管怎样,出于各种其他原因)。在node.js中,这是不必要的。
- @戈洛登+1的生活。这就是我为所有JS文件所做的,也是JS[h_l]int根据我的记忆推荐的。
- 是的,正如前面提到的:由于各种其他原因,例如范围界定、创建模块和公司,这是一种很好的做法。
- 是的,用于作用域的IIFES在前端JS中非常有用,否则任何var/函数声明都将不必要地抛出到全局作用域中。尽管node.js没有这个问题,但是您必须通过module.exports(或global颤抖)手动导出var/函数,因此范围界定并不是节点上的一个问题。好吧,太困了,跟不上,晚上。:P
- @埃里克:谢谢,Chrome的行为和这里的节点完全一样。因为V8是解释器。;)
- @哈希塔:我也开始学习node.js。你能给我提供一些参考资料吗?
- @mohit pandey:事实是我提到学习node.js的堆栈溢出。我参考了这个链接:stackoverflow.com/questions/2353818/…。所以注册并问了这个问题。喜欢人们这么快地评论和回答的方式…感谢所有…..
- 我不确定这是复制品。这个问题有助于我理解node.js与chrome浏览器使用相同的引擎进行解释。如果没有这些知识,对如何应用"使用严格"的理解就很有限。
- @amolmkulkarni:*注意,节点JS将我们的代码(模块)包装成函数(function (exports, require, module, __filename, __dirname, process, global) { .. your module code });,然后由V8处理
"use strict";
基本上它启用了严格模式。
Strict Mode is a feature that allows you to place a program, or a function, in a"strict" operating context. In strict operating context, the method form binds this to the objects as before. The function form binds this to undefined, not the global set objects.
根据你的评论,你说会有一些不同。但这是你的假设。node.js代码只是您的javascript代码。所有node.js代码都由V8 JavaScript引擎解释。V8 Javascript引擎是Google为Chrome Web浏览器开发的开源Javascript引擎。
因此,chrome浏览器和node.js对"use strict";的解释不会有重大差异。
请阅读javascript中的严格模式。
更多信息:
严格模式
浏览器中的ECMAScript 5严格模式支持
严格的模式正在进城
严格模式兼容表
堆栈溢出问题:在javascript中"使用严格"做什么?背后的原因是什么?
ECMAScript 6:
ECMAScript 6代码和严格模式。本规范简要说明如下:
10.2.1 Strict Mode Code
An ECMAScript Script syntactic unit may be processed using either unrestricted or strict mode syntax and semantics. Code is interpreted as strict mode code in the following situations:
-
Global code is strict mode code if it begins with a Directive Prologue that contains a Use Strict Directive (see 14.1.1).
-
Module code is always strict mode code.
-
All parts of a ClassDeclaration or a ClassExpression are strict mode code.
-
Eval code is strict mode code if it begins with a Directive Prologue that contains a Use Strict Directive or if the call to eval is a direct eval (see 12.3.4.1) that is contained in strict mode code.
-
Function code is strict mode code if the associated FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, or ArrowFunction is contained in strict mode code or if the code that produces the value of the function’s [[ECMAScriptCode]] internal slot begins with a Directive Prologue that contains a Use Strict Directive.
-
Function code that is supplied as the arguments to the built-in Function and Generator constructors is strict mode code if the last argument is a String that when processed is a FunctionBody that begins with a Directive Prologue that contains a Use Strict Directive.
此外,如果您对当前版本的node.js支持哪些功能感到迷茫,那么node.green可以帮助您(利用与kangax相同的数据)。
- 为什么这个答案没有任何评论就被否决了?
- 首先,铬并不是地球上唯一的浏览器。仅仅node.js和chrome使用V8,并不意味着它在所有浏览器中都可以工作。第二,加载文件(aka模块)的方式不同。第三,浏览器的脚本通常会连接起来以供生产使用,当您只说两者都是相同的环境时,就会出现问题。它们不是。V8并不是执行node.js文件的唯一重要工具。
- @加布里埃拉马斯:谢谢。@戈洛·罗登:是的,如果评论得当。我们可以给出更多更好的答案。
- @amolmkulkarni:"模块代码始终是严格的模式代码"-对于节点来说并不完全正确。如果在节点V.6.10.2中不使用"use strict",则以下代码不会引发错误:var obj = {}; Object.preventExtensions(obj); obj.a=1;。
- @菲德尔:尽管我不太清楚你的问题。你可以考虑问一个新问题,或者继续在评论中解释它是否与这个问题相关。在那之前,看看这个链接,如果你能找到答案
- 这对研究默认的严格模式有一定的帮助:imaginativethinking.ca/…