什么是“严格模式”,如何使用?
我一直在浏览Mozilla开发者networking上的JavaScript引用,并且遇到了一个叫做"strict mode"
东西。 我读过它,我很难理解它的function。 有人可以简单地解释(一般来说)它的目的是什么,它是如何有用的?
其主要目的是做更多的检查。
只要加上"use strict";
在代码的顶部,在任何其他之前。
例如, blah = 33;
是有效的JavaScript。 这意味着你创build一个完全全局variablesblah
。
但在严格模式下,它是一个错误,因为你没有使用关键字“var”来声明variables。
大多数情况下,你并不意味着在任意范围内创build全局variables,所以大部分时间blah = 33
被写入是一个错误,程序员实际上并不希望它成为一个全局variables,他们打算写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子集,这将成为未来版本语言的一个很好的目标。 严格模式的devise也是希望限制严格模式的开发人员能够减less错误,而且他们所做的错误会以更明显的方式体现出来。
和谐 ,这将有望成为下一个主要版本的EcmaScript将build立在ES5严格的顶部。
和谐build立在ES5严格的模式,以避免太多的模式。
其他一些语言实验也依赖于严格模式。 SES依赖于ES5严格模式的可分析性。
SES(安全ECMAScript)devise实验
通过删除或修复ES5 / Strict中的function来devise对象function编程语言。
从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。
- 分配给未声明的标识符或其他无法parsing的引用不会在全局对象中创build属性。 在严格模式代码中发生简单分配时,其LeftHandSide不得评估为无法parsing的引用。 如果它引发了ReferenceErrorexception(8.7.2)。 LeftHandSide也可能不是对具有属性值{[[Writable]]:false}的数据属性的引用,对属性值为{[[Set]:undefined}的访问器属性,对于不存在的其[[Extensible]]内部属性值为false的对象的属性。 在这些情况下,会引发TypeErrorexception(11.13.1)。
- 标识符eval或参数可能不会显示为赋值运算符(11.13)或PostfixExpression(11.3)的LeftHandSideExpression,也可能不是由前缀递增(11.4.4)或前缀递减(11.4.5)运算符运算的UnaryExpression 。 严格模式函数的参数对象定义了名为“caller”和“callee”的非可configuration访问器属性,它在访问(10.6)时抛出了TypeErrorexception。
- 严格模式函数的参数对象不会dynamic地将其数组索引属性值与其函数的相应forms参数绑定共享。 (10.6)。 对于严格模式函数,如果创build一个参数对象,局部标识符参数与参数对象的绑定是不可变的,因此可能不是赋值expression式的目标。 (10.5)。
- 如果严格模式代码包含具有多个数据属性定义的ObjectLiteral(11.1.5),则它是一个SyntaxError。 如果标识符“eval”或标识符“参数”作为严格代码中包含的PropertyAssignment的PropertySetParameterList中的标识符出现,或者其FunctionBody是严格代码(11.1.5),则为SyntaxError。
- 严格模式的eval代码不能在调用者的variables环境中实例化variables或函数来评估。 相反,创build一个新的variables环境,该环境用于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是对variables,函数参数或函数名称(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。
- 严格模式函数可能没有两个或更多具有相同名称的forms参数。 尝试使用FunctionDeclaration,FunctionExpression或Function构造函数创build这样的函数是一个SyntaxError(13.1,15.3.2)。
- 除了本规范中定义的实现外,实现不得扩展名为调用者的属性或函数实例的参数的严格模式函数中的含义。 ECMAScript代码可能不会在与严格模式函数(10.6,13.2,15.3.4.5.3)对应的函数对象上创build或修改具有这些名称的属性。
- 在严格模式中使用的是一个SyntaxError代码,将标识符eval或参数作为FunctionDeclaration或FunctionExpression的标识符或作为forms参数名称(13.1)。 尝试使用Function构造函数(15.3.2)dynamic地定义这样一个严格的模式函数将会抛出一个SyntaxErrorexception。
ECMAScript 5引入了严格模式的概念。
在代码中调用严格模式
严格模式适用于整个脚本或个人function。 它不适用于大括号中的块语句,试图将其应用于这样的上下文什么也不做。
整个脚本:
假设我们正在创buildapp.js,所以添加第一个语句使用脚本将对整个代码执行严格模式。
// app.js whole script in strict mode syntax “use strict”; // Now you can start writing your code
严格的function模式:
为了调用一个函数的严格模式,把精确的语句“use strict”; 在任何其他语句之前的函数体的开始。
function yourFunc(){ "use strict"; // Your function code logic }
严格模式将一些更改包含在正常的Javascript语义中。 第一严格模式通过改变它们来抛出错误来消除一些JavaScript静默错误。
对于实例:使用严格模式的代码
在上面的代码中没有使用严格模式的代码示例它不会抛出一个错误。 因为我们正在访问variablesx
而没有声明它。 所以在严格模式下访问未声明的variables会抛出一个错误。
现在让我们尝试访问variablesx而不用没有严格模式的声明。
(function(){ x = 3; })(); // Will not throw an error
使用严格模式的优点:
- 通过抛出错误消除JavaScript静默错误。
- 修复了JavaScript引擎难以执行优化的错误。
- 使代码比非严格模式下的代码更快运行
- 禁止在将来版本的ECMAScript中定义一些可能的语法。
严格模式对正常的JavaScript语义进行了一些更改。
-
严格模式通过更改错误来消除一些JavaScript静默错误。
-
严格模式修复了JavaScript引擎难以执行优化的错误。
-
严格模式禁止在未来版本的ECMAScript中定义一些可能的语法。
ECMAScript5
引入了一些新的对象和属性,也是所谓的"strict mode"
。
严格模式是排除不推荐使用的function的语言的子集。 严格模式是opt-in而不是required,意思是说如果你希望你的代码运行在严格模式下,你可以使用(每个函数一次,或者整个程序一次)声明你的意图以下string:
"use strict";
2017年,我终于find了文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
严格模式是一种joinJavaScript的受限变体的方法。 严格模式不仅仅是一个子集:它有意与正常代码有不同的语义。 不支持严格模式的浏览器将运行严格的模式代码,其浏览器的行为不同,所以不要依赖严格模式而不进行特性testing,以支持严格模式的相关方面。 严格模式代码和非严格模式代码可以共存,因此脚本可以渐进地select严格模式。
严格模式对正常的JavaScript语义进行了一些更改。 首先,严格模式通过更改错误来消除一些JavaScript静默错误。 其次,严格模式修复了使JavaScript引擎难以执行优化的错误:严格模式代码有时可以比不是严格模式的相同代码运行得更快。 第三,严格模式禁止在未来版本的ECMAScript中定义一些可能的语法。