您的位置:首页 > Web前端 > JavaScript

JavaScript的strict模式

2016-04-25 20:38 567 查看
use strict;


strict模式是ECMAScript 5语言的一个受限子集,它修正了语言的重要缺陷,并提供健壮的查错功能和增强的安全机制。

严格模式与非严格模式之间的区别如下:

在严格模式中禁止使用with语句。
在严格模式中,所有变量都要先声明,如果给一个未声明的变量、函数、函数参数、catch从句参数或全局对象属性赋值,将会抛出一个异常。而在非严格模式中(这种隐式的声明的全局变量的方法是给全局对象新添一个新属性。
在严格模式中,调用的函数(不是方法)中的一个this值是undefined。(在非严格模式中,调用函数中的this值总是全局对象)。可以利用这种特性来判断JavaScript实现是否支持严格模式:

var hasStrictMode = (function () {"use strict;" return this == undefined}());


同样,在严格模式中,当通过call()或apply()来调用函数时,其中的this值就是通过call()或apply()传入的第一个参数。(在非严格模式中,null和undefined值是被当做全局对象和转换对象的非对象值所代替)
在严格模式中,给只读属性赋值和给不可扩展的对象创建新成员都将抛出一个类型错误异常。(在非严格模式中,这些操作只是简单地操作失败,不会报错)
在严格模式中,传入eval()的代码不能再调用程序所在的上下文中声明变量或定义函数,而在非严格模式下是可以这样做的。相反,变量和函数的定义是在eval()创建的新作用域中,这个作用域在eval()返回时就弃用了。
在严格模式中,函数里的arguments对象拥有传入函数值的静态副本。在非严格模式中,arguments对象中具有“魔术般”的行为,argument里的数组的元素和函数都是指向同一个值的引用。
在严格模式中,当delete运算符后跟非法的标识符时,将会抛出一个异常。(在非严格模式中,这种delete什么也不做,并返回false)
在严格模式中,试图删除一个不可配置的属性将抛出一个类型错误异常(在非严格模式中,delete表达式操作失败,并返回false)
在严格模式中,函数声明存在两个或多个同名参数将产生语法错误(在非严格模式中不会报错)
在严格模式不允许使用八进制整数直接量(以0为前缀)的。
在严格模式中,标识符eval和argument当做关键字,它们的值是不能更改的。不能给这些标识符赋值,也不能把它们声明为变量、当做函数名、用作函数参数或用catch块的标识符。
在严格模式中限制了对调用栈的检测能力,在严格模式函数中,arguments,caller和arguments.callee都会抛出一个一个类型错误异常。严格模式的函数同样具有caller和arguments属性,当访问这两个属性时将抛出类型错误异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: