严格模式

172 阅读3分钟

严格模式(Strict Mode)是一种在 JavaScript 中的执行模式,它提供了更严格的语法和错误检查,以帮助开发者编写更可靠和规范的代码。以下是严格模式的一些特性和影响:

  1. 错误检查和报告: 在严格模式下,JavaScript 引擎会对一些常见的错误和不规范的语法进行检查,并在发现问题时抛出错误。这有助于捕获和纠正潜在的错误,使代码更加健壮。
  2. 变量声明要求: 在严格模式下,变量必须通过 varletconst 关键字进行声明,否则会抛出错误。这防止了意外地创建全局变量,并且要求使用者显式声明变量。
  3. 删除变量的限制: 严格模式下,无法删除声明了的变量、函数、函数形参等。使用 delete 操作符删除变量会抛出错误,这有助于避免意外删除重要的对象。
  4. 全局变量的限制: 在严格模式下,隐式地创建全局变量被禁止。在非严格模式下,如果变量未通过 var 或其他声明方式声明,它会被隐式创建为全局变量。严格模式消除了这种行为,要求变量必须显式声明。
  5. 函数调用的限制: 严格模式要求函数的调用方式更加严格。例如,在非严格模式下,函数的调用者可以通过 call()apply() 方法来改变函数内部的 this 值。而在严格模式下,这种隐式的 this 绑定将被禁止,要求使用者显式绑定 this
  6. 禁止八进制字面量: 在非严格模式下,八进制字面量(以 0 开头的数字)被解释为八进制数值。然而,在严格模式下,八进制字面量被视为无效的,使用八进制字面量会导致语法错误。
  7. eval() 的限制: 严格模式限制了对 eval() 函数的使用。在非严格模式下,eval() 函数可以动态地执行字符串中的代码,但在严格模式下,它的作用受到限制,不能在其作用域外声明变量。

// 全局作用域下的严格模式

function strictModeExample() {
  "use strict";

  // 函数内部的严格模式

  // 使用未声明的变量,会抛出错误
  x = 10;
  console.log(x); // 抛出 ReferenceError: x is not defined

  // 删除变量,会抛出错误
  var y = 20;
  delete y; // 抛出 SyntaxError: Delete of an unqualified identifier in strict mode.

  // 使用八进制字面量,会抛出错误
  var octalNumber = 0123; // 抛出 SyntaxError: Octal literals are not allowed in strict mode.

  // 函数调用中的 this 绑定限制
  function displayThis() {
    console.log(this);
  }
  displayThis(); // 在严格模式下,函数内的 this 值为 undefined,而不是全局对象

  // 禁止使用 with 语句
  var obj = { a: 1, b: 2 };
  with (obj) {
    console.log(a); // 抛出 SyntaxError: Strict mode code may not include a with statement.
  }
}

strictModeExample();

通过启用严格模式,开发者可以在开发过程中获得更多的错误检查和规范限制,提高代码的可靠性和可维护性。要在整个脚本中启用严格模式,可以在脚本开头或函数