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

nkc*_*cmr 130 javascript strict-mode

我一直在浏览Mozilla开发者网络上的JavaScript参考,我遇到了一些叫做的东西"strict mode".我读了它,我很难理解它的作用.有人可以简要解释(一般)它的目的是什么以及它有用吗?

Sim*_*ris 148

其主要目的是进行更多检查.

只需"use strict";在代码顶部添加其他内容.

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

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

大多数情况下,你并不是要在某个任意范围的中间创建全局变量,因此大多数时候blah = 33写入它是一个错误而程序员实际上并不希望它是一个全局变量,它们意味着写var blah = 33.

它同样不允许许多在技术上有效的事情.NaN = "lol"不会产生错误.它也不会改变NaN的值.using strict(和类似的奇怪语句)会产生错误.大多数人都很欣赏这一点,因为没有理由写NaN = "lol",所以很可能是一个错字.

在严格模式的MDN页面上阅读更多内容

  • 你对它的效用有什么不了解呢?它的目的是通过捕获有效但最有可能出错的事物来帮助开发. (23认同)
  • 这与MDN上的文档完全相同 (4认同)

Ada*_*kis 33

Simon的答案中没有提到的严格模式的一个方面是严格模式设置thisundefined通过函数调用调用的函数.

所以这样的事情

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

   function privateMethod() {
     this.b = "foo";
   }
}
Run Code Online (Sandbox Code Playgroud)

privateMethod调用时会导致错误(因为您无法添加属性undefined),而不是无用地向b全局对象添加属性.

  • 是的,需要添加`privateMethod.bind(this)();`并调用`new` [`jsbin.com`](https://jsbin.com/foyomo/edit?html,js,console) (4认同)

Mik*_*uel 21

添加了严格模式,以便有一个易于静态分析的EcmaScript子集,它将成为该语言未来版本的一个很好的目标.严格模式的设计也希望限制自己严格模式的开发人员能够减少错误,并且他们所做的错误会以更明显的方式表现出来.

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

Harmony建立在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或参数可能不会显示为赋值运算符(11.13)或PostfixExpression(11.3)的LeftHandSideExpression,也不会显示为由前缀增量(11.4.4)或前缀减量(11.4.5)运算符操作的UnaryExpression .严格模式函数的参数对象定义名为"caller"和"callee"的非可配置访问器属性,这些属性在访问时抛出TypeError异常(10.6).
  • 严格模式函数的参数对象不会使用其函数的相应形式参数绑定动态共享其数组索引属性值.(10.6).对于严格模式函数,如果创建了一个arguments对象,则本地标识符参数与arguments对象的绑定是不可变的,因此可能不是赋值表达式的目标.(10.5).
  • 如果严格模式代码包含具有多个任何数据属性定义的ObjectLiteral(11.1.5),则为SyntaxError.如果标识符"eval"或标识符"arguments"作为PropertyAssignment的PropertySetParameterList中的标识符出现,它包含在严格代码中或者其FunctionBody是严格代码(11.1.5),则为SyntaxError.
  • 严格模式eval代码无法在调用者的变量环境中将变量或函数实例化为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是对变量,函数参数或函数名称的直接引用,则抛出SyntaxError(11.4.1).
  • 当严格模式代码中出现删除操作符时,如果要删除的属性具有属性{[[Configurable]]:false}(11.4.1),则抛出TypeError.如果VariableDeclaration或VariableDeclarationNoIn出现在严格代码中且其Identifier是eval或arguments(12.2.1),则为SyntaxError.
  • 严格模式代码可能不包含WithStatement.在这样的上下文中出现WithStatement是SyntaxError(12.10).
  • 如果带有Catch的TryStatement在严格代码中出现并且Catch生成的标识符是eval或arguments(12.14.1),那么这是一个SyntaxError
  • 如果标识符eval或arguments出现在严格模式FunctionDeclaration或FunctionExpression(13.1)的FormalParameterList中,则为SyntaxError
  • 严格模式函数可能没有两个或多个具有相同名称的形式参数.尝试使用FunctionDeclaration,FunctionExpression或Function构造函数创建此类函数是SyntaxError(13.1,15.3.2).
  • 除了本规范中定义的实现之外,实现可能不会扩展在名为caller的属性的严格模式函数或函数实例的参数内的含义.ECMAScript代码可能无法在与严格模式函数(10.6,13.2,15.3.4.5.3)对应的函数对象上创建或修改具有这些名称的属性.
  • 它是一个SyntaxError,在严格模式代码中使用标识符eval或arguments作为FunctionDeclaration或FunctionExpression的标识符或作为形式参数名称(13.1).尝试使用Function构造函数(15.3.2)动态定义此类严格模式函数将引发SyntaxError异常.


Nis*_*mar 6

ECMAScript 5引入了严格模式的概念.

在代码中调用严格模式

严格模式适用于整个脚本或单个功能.它不适用于{}括号中的块语句,尝试将其应用于此类上下文时不会执行任何操作.

整个脚本:

假设我们正在创建app.js,因此添加第一个语句使用脚本将对整个代码强制执行严格模式.

// app.js whole script in strict mode syntax
“use strict”;
// Now you can start writing your code 
Run Code Online (Sandbox Code Playgroud)

严格的功能模式:

要为函数调用严格模式,请输入确切的语句"use strict"; 在任何其他语句之前的函数体的开头.

function yourFunc(){
 "use strict";

 // Your function code logic
}
Run Code Online (Sandbox Code Playgroud)

严格模式包含对常规Javascript语义的若干更改.第一个严格模式通过更改它们以抛出错误来消除一些JavaScript无声错误.

对于实例:使用严格模式的代码

在此输入图像描述

在上面的代码示例中没有在代码中使用严格模式它不会抛出错误.因为我们在x不声明变量的情况下访问变量.因此在严格模式下访问未声明的变量会引发错误.

现在让我们尝试访问变量x而不用在没有严格模式的情况下声明它.

(function(){
    x = 3;
})();

// Will not throw an error
Run Code Online (Sandbox Code Playgroud)

使用严格模式的优点:

  • 抛出错误消除JavaScript无提示错误.
  • 修复了使JavaScript引擎难以执行优化的错误.
  • 使代码运行得更快,而不是严格模式下的相同代码
  • 禁止在ECMAScript的未来版本中定义某些语法.


Ren*_*M G 5

严格模式对常规JavaScript语义进行了一些更改.

  • 严格模式通过更改它们以抛出错误来消除一些JavaScript无提示错误.

  • 严格模式修复了使JavaScript引擎难以执行优化的错误.

  • 严格模式禁止在ECMAScript的未来版本中可能定义的某些语法.