- 严格模式下,不允许使用with
- delete运算符后跟随非法标识符(即delete 不存在的标识符),会抛出语法错误; 非严格模式下,会静默失败并返回false
- 严格模式中,对象直接量中定义同名属性会抛出语法错误; 非严格模式不会报错
- 严格模式中,函数形参存在同名的,抛出错误; 非严格模式不会
- 严格模式不允许八进制整数直接量(如:023)
- 严格模式中,arguments对象是传入函数内实参列表的静态副本;非严格模式下,arguments对象里的元素和对应的实参是指向同一个值的引用
- 严格模式中 eval和arguments当做关键字,它们不能被赋值和用作变量声明
- 严格模式会限制对调用栈的检测能力,访问arguments.callee.caller会抛出异常
- 严格模式 变量必须先声明,直接给变量赋值,不会隐式创建全局变量
- 严格模式中 call apply传入null undefined保持原样不被转换为window
来张图,更清楚:
严格模式 | 非严格模式 |
---|---|
禁止使用with语句 | 允许使用with语句 |
所有变量要先声明 | 使用未声明的变量将隐式声明为全局变量 |
函数(非方法)中的this 是undefined |
this 是全局对象 |
call() 和apply() 传入的第一个值不会被转换 |
call() 和apply() 传入的第一个值如果是null 和undefined ,则会被全局对象取代,如果是原始值则转换为对应的包装对象 |
给只读属性和不可扩展的对象创建新成员将抛出类型错误异常 | 只是简单的操作失败 |
传入eval() 的代码不能在定义变量和函数 |
变量和函数定义在eval() 创建的新作用域中 |
函数中的arguments 对象拥有传入函数值的静态副本 |
|
delete 后跟非法标识符将抛出语法错误异常 |
只是简单的返回false |
delete 删除不可配置的属性将抛出类型错误异常 |
只是简单的返回false |
在对象直接量中定义多个同名属性将产生语法错误 | 不会报错 |
函数声明存在多个同名的参数将产生语法错误 | 不会报错 |
不允许使用八进制直接量 | 某些实现是允许的 |
eval 和arguments 当作关键字,并且不允许更改 |
|
限制了对栈的检测能力,arguments.caller 和arguments.callee 将抛出类型错误异常 |