js 严格模式

变量必须定义
  • 会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值/删除操作抛出异常.如给不可写的变量赋值,删除不可删除的属性。
  • 函数不可重复参数名 // 字面量对象不能写重复属性,计算属性不算重复
  • 禁止单独0开头的八进制数字语法,es6有0o
  • 禁止 with,因为难以阅读
  • eval 中定义的变量只会影响内层
  • 禁止删除(delete)声明变量,在 eval 中声明的变量事实上没有 Don‘tDelete 属性。在 eval 代码中的函数内部通过 var 定义的变量具有 DontDelete,不能被删除。
  • eval 和 arguments 不能通过程序语法被绑定(be bound)或赋值,而是将它们作为关键字
  • 参数的值不会随 arguments 对象的值的改变而变化
  • 不再支持 arguments.callee // 指向当前执行的函数。
  • 不再支持 fun.caller 和 fun.arguments,不能在函数内得到调用栈
  • 尾调用优化 // 得益于上一条
  • 通过 this 传递给一个函数的值不会被强制转换为一个对象,没有指定的 this 就是 undefined。
  • 稀疏模式全局环境中 this 返回全局对象,严格模式中是 undefined
  • 有些字符变成保留的关键字,implements, interface, let, package, private, protected, public, static, yield
  • 禁止不在脚本或者函数层面上的函数声明,即语句 {} 块 /if/for 中不能定义函数。

  • "use strict" 指令所处的位置是函数体的开头,而不是整个函数的开头。

    严格模式中创建稀疏(非严格模式)函数使用 Function/eval

    class和模块默认严格模式,所以模块中不能为未声明变量赋值(而 CommonJS 不指定严格模式时就自动新建了全局变量)