ES5中“严格模式”和”非严格模式“
| 严格模式 | 非严格模式 |
| 禁止使用with语句 | 允许使用with语句 |
| 所有变量要先声明 | 使用为声明的变量将隐式声明为全局变量 |
| 函数(非方法)中的this是undefined | this是全局对象 |
| call()和apply()传入的第一个值不会被转换 | call()和apply()传入的第一个值如果是null和undefined,则会被全局对象取代,如果是原始值则转换为对应的包装对象 |
| 给只读属性和不可扩展的对象创建新成员将抛出类型错误异常 | 只是简单的操作失败 |
| 传入eval()的代码不能在定义变量和函数 | 变量和函数定义在eval()创建的新作用域中 |
| 函数中的arguments对象拥有传入函数值的静态副本 | |
| delete后跟非法标识符将抛出类型错误异常 | 返回false |
| delete删除不可配置的属性将抛出类型错误异常 | 返回false |
| 在对象直接量中定义多个同名属性将产生语法错误 | 不报错 |
| 函数声明存在多个同名的参数将产生语法错误 | 不报错 |
| 不允许使用八进制直接量 | 某些实现是允许的 |
| eval和arguments当做关键字,并且不允许更改 | |
| 限制了对栈的检测能力,arguments .caller和arguments.callee将抛出类型错误异常 |
测试是否开启严格模式
var hasStrictMode = function() { "use strict"; return this === undefined }

浙公网安备 33010602011771号