JavaScript 严格模式与混乱模式

从 ES5 开始,ES5引入了严格模式(Strict Mode),并使用use strict作为语法声明未使用严格模式时,则称之为混乱模式(非严格模式)

ES6 的 class 与模块内默认采用严格模式。

严格模式非严格模式

禁止使用with语句

允许使用with语句

所有变量要先声明

使用未声明的变量将隐式声明为全局变量

函数中的thisundefined

this默认指向全局对象

call()apply()传入的第一个值不会被转换

call()apply()传入的第一个值如果是nullundefined则会被全局对象取代,如果是原始值则转换为对应的包装对象

给只读属性和不可扩展的对象创建新成员将会抛出类型错误异常

只是简单的操作失败

传入eval()的代码不能再定义变量和函数

变量和函数定义在eval()创建的新作用域中

delete后跟非法标识符将抛出语法错误异常

只是简单的返回false

delete删除不可配置的属性将抛出类型错误异常

只是简单的返回false

在对象直接量中定义多个同名属性将产生语法错误

不会报错

函数声明存在多个同名的参数将产生语法错误

不会报错

不允许使用八进制直接量

允许部分实现

eval()arguments当作关键字,并且不允许更改

限制了对栈的检测能力,arguments.callerarguments.callee将抛出类型错误异常

函数中的arguments对象拥有传入函数值的静态副本

示例:

function func() {
    console.log(this);
}
func(); // window

function func2() {
    'use strict'
    console.log(this);
}
func2(); // undefined

class A {
    method(obj) {
        console.log(this);
    }
}
const a = new A;
const aMethod = a.method;
aMethod(); // undefined

最后更新于