"use strict"
"use strict"是ECMAScript 5引入的一条指令。指令不是语句(但非常接近语句),“use strict”指令和普通的语句之间有两个重要的区别
- 它不包含任何语言的关键字,指令仅仅是一个包含一个特殊字符串直接量的表达式(可以是单引号也可以使用双引号),对于那些没有实现ECMAScript 5的JavaScript解释器来说,它只是一条没有副作用的表达是语句,它什么也没做。将来的ECMAScript 标准希望将use用做关键字,这样就可以省略引号了。
- 它只能出现在脚本代码的开始或者函数体的开始、任何实体语句之前。但它不必一定出现在脚本的首行或函数体内的首行,因为“use strict”指令之后或之前都可能有其他字符串直接量表达式语句,并且JavaScript的具体实现可能将它们解析为解释器自有的指令。在脚本或者函数体内第一条常规语句之后字符串直接量表达式语句只当做普通的表达式语句对待;它们不会当做指令解析,它们也没有任何副作用。
使用“use strict”指令的目的是说明(脚本或函数中)后续的代码将会解析为严格代码(strict code)。如果顶层(不在任何函数内的)代码使用了“use strict”指令,那么它们是严格代码。如果函数体定义所处的代码是严格代码或者函数体是用来“use strict”指令,那么函数体的代码也是严格代码。如果eval()调用时所处的代码是严格代码或者eval()要执行的字符串使用了“scrict code”指令,则eval()内的代码是严格代码。
严格代码以严格模式执行。ECMAScript 5中的严格模式是该语言的一个受限制的子集,它修正了语言的重要缺陷,并提供了健壮的查错功能和增强的安全机制。严格模式和非严格模式之间的区别很多,例举三条重要的:
- 在严格模式中禁止使用with语句。
- 在严格模式中,所有的变量都要先声明,如果给一个未声明的变量、函数、函数参数、catch从句参数或全局对象的属性赋值,将会抛出一个引用错误异常(在非严格模式中,这种隐式声明的全局变量的方法是给全局对象新添加一个新属性)。
- 在严格模式中,调用的函数(不是方法)中的一个this值是undefined。(在非严格模式中,调用的函数中的this总是全局对象)。可以利用这种特性来判断JavaScript实现是否支持严格模式。
var hasStrictMode = ( function(){ "use strict"; return this == undefined } );