什么是“严格模式”,它是如何使用的?

我一直在浏览Mozilla开发者网络上的JavaScript参考,并且我遇到了一种叫做"strict mode"东西。 我把它读完了,我很难理解它的功能。 有人可以简单地解释(一般)它的目的是什么以及它的用途如何?


它的主要目的是做更多的检查。

只需添加"use strict"; 在代码的顶部,在其他任何事情之前。

例如, blah = 33; 是有效的JavaScript。 这意味着你创建一个完全全局变量blah

但是在严格模式下它是一个错误,因为你没有使用关键字“var”来声明变量。

大多数情况下,你并不是要在任意范围内创建全局变量,所以大部分时间blah = 33被写入它是一个错误,程序员实际上并不希望它成为一个全局变量,他们打算写var blah = 33

它同样不允许很多技术上有效的事情。 NaN = "lol"不会产生错误。 它也不会改变NaN的值。 严格使用(和类似的怪异声明)会产生错误。 大多数人都很欣赏这一点,因为没有理由会写出NaN = "lol" ,所以最有可能是一个错字。

在严格模式下阅读更多MDN页面


在Simon的答案中没有提到的严格模式的一个方面是严格模式this设置为undefined在通过函数调用调用的函数中。

所以这样的事情

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

privateMethod时会导致错误(因为您无法将属性添加到undefined的属性中),而不是无用地将b属性添加到全局对象。


增加了严格模式,这样就会有一个容易静态分析的EcmaScript子集,这将成为未来版本语言的良好目标。 严格模式的设计也是希望限制严格模式的开发人员能够减少错误,并且他们所做的错误会以更明显的方式体现出来。

和谐,将有望成为EcmaScript的下一个主要版本将建立在ES5严格的基础之上。

和谐建立在ES5严格模式上以避免太多模式。

其他一些语言实验也依赖于严格模式。 SES依赖于ES5严格模式的可分析性。

SES(安全ECMAScript)设计实验

通过删除或修复ES5 / Strict中的功能设计对象功能编程语言。

应该有一个从SES到ES5 / Strict的直接翻译。

该标准的附录C解释了严格模式和正常模式之间的区别。

严格的模式限制和例外

  • 标识符“implements”,“interface”,“let”,“package”,“private”,“protected”,“public”,“static”和“yield”在严格模式代码中被分类为FutureReservedWord令牌。 (7.6.12 [?])。
  • 符合性实现在处理严格模式代码时,不得扩展NumericLiteral(7.8.3)的语法以包含B.1.1中所述的OctalIntegerLiteral。
  • 在处理严格模式代码时(见10.1.1),一致性实现可能不会扩展EscapeSequence的语法以包含如B.1.2所述的OctalEscapeSequence。
  • 分配给未声明的标识符或其他无法解析的引用不会在全局对象中创建属性。 在严格模式代码中发生简单分配时,其LeftHandSide不能评估为无法解析的引用。 如果它引发ReferenceError异常(8.7.2)。 LeftHandSide也可能不是具有属性值{[[Writable]]:false}的数据属性对具有属性值{[[Set]:undefined}的访问器属性的引用,也不是对不存在的属性值的引用其[[Extensible]]内部属性值为false的对象的属性。 在这些情况下会引发TypeError异常(11.13.1)。
  • 标识符eval或参数可能不会显示为Assignment运算符(11.13)或PostfixExpression(11.3)的LeftHandSideExpression,或者是前缀增量(11.4.4)或前缀递减(11.4.5)运算符所操作的UnaryExpression 。 严格模式函数的参数对象定义了名为“调用者”和“被调用者”的非可配置访问器属性,它在访问时引发了TypeError异常(10.6)。
  • 严格模式函数的参数对象不会动态地将其数组索引属性值与其函数的相应形式参数绑定共享。 (10.6)。 对于严格模式函数,如果创建参数对象,则局部标识符参数与参数对象的绑定是不可变的,因此可能不是赋值表达式的目标。 (10.5)。
  • 如果严格模式代码包含具有多个数据属性定义的ObjectLiteral(11.1.5),则它是一个SyntaxError。 如果标识符“eval”或标识符“参数”作为严格代码中包含的PropertyAssignment的PropertySetParameterList中的标识符出现,或者其FunctionBody是严格代码(11.1.5),则它是SyntaxError。
  • 严格模式的eval代码不能在调用者的变量环境中实例化变量或函数来评估。 相反,会创建一个新的变量环境,并将该环境用于eval代码(10.4.2)的声明绑定实例化。
  • 如果在严格模式代码中对此进行评估,则该值不会被强制转换为对象。 null或undefined的这个值不会转换为全局对象,并且原始值不会转换为包装器对象。 通过函数调用传递的值(包括使用Function.prototype.apply和Function.prototype.call调用的函数)不会强制将此值传递给对象(10.4.3,11.1.1,15.3.4.3,15.3。 4.4)。
  • 当在严格模式代码中出现删除操作符时,如果其UnaryExpression是对变量,函数参数或函数名称(11.4.1)的直接引用,则会抛出SyntaxError。
  • 当在严格模式代码中发生删除操作时,如果要删除的属性具有属性{[[Configurable]]:false}(11.4.1),则会引发TypeError。 如果VariableDeclaration或VariableDeclarationNoIn出现在严格代码中并且其标识符是eval或参数(12.2.1),则它是一个SyntaxError。
  • 严格模式代码可能不包含WithStatement。 在这种情况下发生WithStatement是一个SyntaxError(12.10)。
  • 如果带有Catch的TryStatement出现在严格代码中并且Catch生产的标识符是eval或参数(12.14.1),则它是一个SyntaxError。
  • 如果标识符eval或参数出现在严格模式FunctionDeclaration或FunctionExpression(13.1)的FormalParameterList中,则它是SyntaxError。
  • 严格模式函数可能没有两个或更多具有相同名称的形式参数。 使用FunctionDeclaration,FunctionExpression或Function构造函数创建此类函数的尝试是SyntaxError(13.1,15.3.2)。
  • 除了本规范中定义的实现之外,实现不能扩展名为调用者或函数实例参数的属性的严格模式函数中的含义。 ECMAScript代码可能不会在与严格模式函数(10.6,13.2,15.3.4.5.3)对应的函数对象上创建或修改具有这些名称的属性。
  • 它是一个SyntaxError,用于在严格模式下将标识符eval或参数用作FunctionDeclaration或FunctionExpression的标识符或作为形式参数名称(13.1)。 尝试使用Function构造函数(15.3.2)动态定义这样的严格模式函数将引发SyntaxError异常。
  • 链接地址: http://www.djcxy.com/p/97019.html

    上一篇: what is "strict mode" and how is it used?

    下一篇: How to collect user defined functions in a liberary in nodjs?