使用'use strict';
不会突然使您的代码变得更好。
在JavaScript的严格模式是一个功能的ECMAScript 5。您可以通过在脚本/函数顶部进行声明来启用严格模式。
'use strict';
当JavaScript引擎看到此指令时,它将开始以特殊模式解释代码。在这种模式下,当检测到某些可能最终成为潜在错误的编码实践时,就会引发错误(这是严格模式下的原因)。
考虑以下示例:
var a = 365;
var b = 030;
为了对数字文字进行排队,开发人员在不经意间将变量初始化b
为八进制文字。非严格模式会将其解释为带有值的数字文字24
(以10为底)。但是,严格模式将引发错误。
有关严格模式下的专业的详尽列表,请参见此答案。
我应该在哪里使用'use strict';
?
如何使用严格模式?
'use strict';
在脚本顶部插入一条语句:
// File: myscript.js
'use strict';
var a = 2;
....
请注意,文件中的所有内容都myscript.js
将以严格模式进行解释。
或者,'use strict';
在函数主体顶部插入一条语句:
function doSomething() {
'use strict';
...
}
函数的词法范围内的所有内容都doSomething
将以严格模式进行解释。这个词词汇范围是很重要的位置。例如,如果您的严格代码调用非严格库的函数,则仅您的代码以严格模式执行,而不是被调用函数。请参阅此答案以获得更好的解释。
严格模式下禁止哪些事情?
我找到了一篇不错的文章,描述了严格模式下禁止的几件事(请注意,这不是排他性清单):
范围
从历史上看,JavaScript对于函数的作用域一直感到困惑。有时它们似乎是静态作用域的,但是某些功能使它们的行为就像动态作用域一样。这令人困惑,使程序难以阅读和理解。误会导致错误。这也是性能问题。静态作用域将允许变量绑定在编译时发生,但是对动态范围的要求意味着必须将绑定推迟到运行时,这会带来很大的性能损失。
严格模式要求所有变量绑定都是静态完成的。这意味着必须消除或修改以前需要动态绑定的功能。具体来说,消除了with语句,并且eval函数篡改其调用者环境的能力受到严格限制。
严格代码的好处之一是,诸如YUI Compressor之类的工具
在处理代码时可以做得更好。
隐含全局变量
JavaScript隐含了全局变量。如果未显式声明变量,则会为您隐式声明全局变量。这使初学者更容易编程,因为他们可以忽略一些基本的家务劳动。但是,这使大型程序的管理更加困难,并且大大降低了可靠性。因此,在严格模式下,将不再创建隐式全局变量。您应该显式声明所有变量。
全球泄漏
在许多情况下,可能会导致this
绑定到全局对象。例如,如果您new
在调用构造函数时忘记提供前缀,则构造函数this
将意外绑定到全局对象,因此,与其初始化一个新对象,不如对它进行静默篡改全局变量。在这些情况下,严格模式将改为绑定this
到undefined
,这将导致构造函数抛出异常,从而允许更早地检测到错误。
嘈杂的失败
JavaScript一直具有只读属性,但是您无法自己创建它们,直到ES5的Object.createProperty
功能公开了该功能。如果尝试将值分配给只读属性,则它将静默失败。分配不会更改属性的值,但是您的程序将像执行该操作一样进行。这是完整性危害,可能导致程序进入不一致状态。在严格模式下,尝试更改只读属性将引发异常。
八进制
在字长为3的倍数的计算机上进行机器级编程时,数字的八进制(或基数8)表示非常有用。在使用CDC 6600大型机(字长为60位)时,您需要八进制数。如果您能读八进制,则可以将一个单词看成20位数字。两位数字表示操作码,一位数字标识8个寄存器之一。在从机器代码到高级语言的缓慢过渡期间,人们认为以编程语言提供八进制形式很有用。
在C语言中,选择了一个非常不幸的八进制表示形式:前导零。因此,在C语言中,它0100
表示64,而不是100,并且08
是错误,而不是8。更不幸的是,这种过时现象已被复制到几乎所有现代语言中,包括JavaScript,在其中它仅用于创建错误。它没有其他目的。因此,在严格模式下,不再允许使用八进制形式。
等等
参数伪数组在ES5中变得有点像数组。在严格模式下,它会丢失callee
和caller
属性。这样就可以将您的arguments
代码传递给不受信任的代码,而无需放弃很多机密上下文。而且,arguments
功能的
性质被消除。
在严格模式下,函数文字中的重复键将产生语法错误。一个函数不能有两个具有相同名称的参数。函数不能具有与其参数之一相同名称的变量。函数不能delete
拥有自己的变量。delete
现在,对不可配置属性的尝试将
引发异常。原始值不会隐式包装。
将来的JavaScript版本的保留字
ECMAScript 5添加了保留字列表。如果将它们用作变量或参数,则严格模式将引发错误。保留字为:
implements
,interface
,let
,package
,private
,protected
,public
,static
,和yield
进一步阅读