js中的严格模式(use strict)

文章共1.2k个字 读完大约需要4分钟

use strict是ECMAScript5引入的一条指令。它不包含任何语言的关键字,可以使用双引号和单引号,对于没有实现ECMAScript的浏览器来说它什么也不做。它只能出现在脚本代码的开始或者函数体的开始、任何实体语句之前。但它不必一定出现在脚本的首行或函数体内的首行, 因为"use strict" 指令之后或之前都可能有其他字符串直接量表达式语句, 并且JavaScript的具体实现可能将它们解析为解释器自有的指令。

使用use strict指令之后,将被解析为严格模式,所有的代码都在严格模式下执行。ECMAScript5中的严格模式是该语言的一个子集,它修正了语言的重要缺陷,并提供健壮的查错功能和增强的安全机制。严格模式和非严格模式之间的区别如下(前三条尤为重要):

  • 在严格模式中禁止使用with语句。
  • 在严格模式中, 所有的变量都要先声明, 如果给一个未声明的变量、函数、函数参数、catc h从句参数或全局对象的属性赋值, 将会抛出一个引用错误异常(在非严格模式中, 这种隐式声明的全局变量的方站是给全局对象新添加一个新属性)。
  • 在严格模式中, 调用的函数(不是方怯)中的一个this{直是undefined。(在非严格模式中, 调用的函数中的this值总是全局对象)。可以利用这种特性来判断JavaScript实现是否支持严格模式:
1
var hasStrictMode = (function() { ”use strict” ; return this===undefined} (});
  • 在严格模式中, 当通过call()apply()来调用函数时, 其中的this值就是通过call()apply()传入的第一个参数(在非严格模式中, null和undefined值被全局对象和转换为对象的非对象值所代替)。
  • 在严格模式中, 给只读属性赋值和给不可扩展的对象创建新成员都将抛出一个类型错误异常(在非严格模式中, 这些操作只是简单地操作失败, 不会报错)。
  • 在严格模式中, 传人eval()的代码不能在调用程序所在的上下文中声明变量或定义函数, 而在非严格模式中是可以这样做的。相反, 变量和函数的定义是在eval()创建的新作用域中, 这个作用域在eval()返回时就弃用了。
  • 在严格模式中, 函数里的arguments对象拥有传人函数值的静态副本。在非严格模式中,arguments对象具有“魔术般” 的行为,arguments里的数组元素和函数参数都是指向同一个值的引用。
  • 在严格模式中, 当delete运算符后跟随非怯的标识符(比如变量、函数、函数参数)时,将会抛出一个语捷错误异常(在非严格模式中, 这种delete表达式什么也没做,井返回false)。
  • 在严格模式中, 试图删除一个不可配置的属性将抛出一个类型错误异常(在非严格模式中, delete表达式操作失败, 并返回false)。
  • 在严格模式中, 在一个对象直接量中定义两个或多个同名属性将产生一个语站错误(在非严格模式中不会报错)。
  • 在严格模式中,函数声明中存在两个或多个同名的参数将产生一个语法错误(在非严格模式中不会报错)。
  • 在严格模式中是不允许使用八进制整数直接量(以0为前缀,而不是Ox为前缀)的(在非严格模式中某些实现是允许八进制整数直接量的)。
  • 在严格模式中,标识符evalarguments当做关键字,它们的值是不能更改的。不能给这些标识符赋值,也不能把它们声明为变量、用做函数名、用做函数参数或用做catch块的标识符。
  • 在严格模式中限制了对调用桔的检测能力,在严格模式的函数中, arguments.callerarguments.callee都会抛出一个类型错误异常。严格模式的函数同样具有callerarguments属性, 当访问这两个属性时将抛出类型错误异常(有一些JavaScript的实现在非严格模式里定义了这些非标准的属性)。

摘自[JavaScript权威指南(第六版)]

推荐文章

-->