javascript权威指南 严格模式与非严格模式的一些区别

可参考大神的文章:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

使用严格模式:

“use strict”;
'use strict';

1.严格模式中禁止使用with语句(本来我就不喜欢with语句)

2.严格模式中,所有的变量都要先声明,否则则会抛出一个错误异常 (我就喜欢这样的),并且 var a ={};a.b=2;这类添加属性的并不会报错。

3.在严格模式中,调用的函数(不是方法,方法是指对象里的函数。 函数是函数)中的一个this值是undefined,在非严格模式中,调用的函数中的this总是指向全局变量。

4.严格模式中,当通过call()或apply()调用函数时,其中的this值就是通过call()或apply()传入的第一个参数(非严格模式中,如果apply或call的第一个参数为null和undefined,那么值被全局对象和转换为对象的非对象值所代替) 3和4表示的含义一样,即严格模式下this不会因为值为undefined或null而被替换成window对象。

5.严格模式中,给只读属性赋值和给不可扩展的对象创建新成员都将抛出一个类型错误一场(在非严格模式中,这些操作只是简单的操作失败,不会报错,我觉得报错更好,提醒不规范的行为)

6.在严格模式中,传入eval()的代码不能再调用程序所在的上下文中声明变量或定义函数,而在非严格模式下是可以这样做的,相反,变量和函数的定义是在eva()创建的新作用域中,这个作用域在eval()返回时就弃用了。  (好坏都有)

7. 严格模式中,函数中的arguments对象拥有传入函数值的静态副本(注意如果传入参数是引用类型,arguments拥有的是引用副本,仍然指向同一个对象),在非严格模式中,arguments元素和函数参数都是指向同一个值的引用。8. 严格模式中,当delete运算符后跟随非法的标识符(变量,函数,函数参数时),将会抛出一个语法错误异常(在非严格模式中,delete选择符什么也没做,并返回false,有try  catch,大胆的抛出异常吧)

9. 在严格模式中,视图删除一个不可配置的属性将会抛出一个类型错误异常(非严格模式中,delete表达式操作失败,并返回false)

10. 在严格模式中,在一个对象直接量中定义两个或多个同名属性将会报错(非严格模式中将会报错)

11. 在严格模式中,在一个函数声明中存在两个或者多个同名参数将产生一个语法错误(在非严格模式中不会报错)

12. 在严格模式中,不允许使用八进制整数直接量(?为啥啊),非严格模式中的某些实现是匀速八进制整数直接量的

13. 严格模式中,eval和arguments被当作关键字,它们不能被赋值,也不能声明为变量。

14. 严格模式中限制了对调用栈的检测能力,在严格模式中,arguments.caller和arguments.callee都会抛出一个类型错误异常。严格模式中同样有caller和callee属性,但访问这两个属性时将抛出类型错误异常。