Skip to content
导航

严格模式

严格模式是采用具有限制性 JavaScript 变体的一种方式。

启用严格模式

js
"use strict"; // 整个脚本都开启严格模式的语法
js
function strict() {
  // 函数级别严格模式语法
  'use strict';
}

在严格模式中运行非严格模式的代码,可能报错。因此推荐使用函数级别严格模式。

严格模式的改变

将问题直接转化为错误

  1. 未定义的变量,不再创建为全局变量
  2. 不可写属性、只读属性、不可扩展对象新属性赋值,不再静默失败
  3. 删除不可删除的属性,不再静默失败
  4. 定义对象时出现重名属性,报语法错误
  5. 函数的参数名出现重名,报语法错误
  6. 禁止八进制数字语法。如017表示15
  7. 禁止设置基本类型的属性。如false.val = ''

编译器优化

通过禁用JavaScript的部分灵活功能来方便编译器优化代码:

  1. 禁用with
  2. eval 不会使得内部定义影响到eval外部变量
  3. 禁止删除仅声明但未定义变量
  4. evalarguments像保留字一样,不可任意使用
  5. 禁用arguments.callee

更安全

  1. this不做类型转换,没有指定时默认值为undefined
  2. 禁用 fn.argumentsfn.caller
  3. 禁用arguments.caller

为未来版本增加保留字

在严格模式下,不能再用这些名字作为变量名或者形参名:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

禁止任意位置的函数声明

js
"use strict";
if (true) {
  function f() { } // !!! 语法错误
  f();
}

for (var i = 0; i < 5; i++) {
  function f2() { } // !!! 语法错误
  f2();
}

function foo() { // 合法
  function bar() { } // 同样合法
}

参考资料