一、什么是严格模式

严格模式(Strict Mode)是JavaScript的一个特殊执行环境,它通过更严格的语法检查和行为限制,帮助开发者避免一些常见的编码陷阱。在严格模式下,一些原本被静默忽略的错误会直接抛出异常,同时某些不推荐使用的语法会被禁用。

要启用严格模式,只需要在脚本或函数的开头添加 "use strict"; 即可:

// 示例:全局严格模式(技术栈:JavaScript)
"use strict";

function testStrictMode() {
  // 在严格模式下,未声明的变量会直接报错
  undeclaredVar = 10; // ReferenceError: undeclaredVar is not defined
}

testStrictMode();

严格模式可以应用于整个脚本文件,也可以仅作用于单个函数。如果放在函数内部,则仅在该函数范围内生效:

// 示例:局部严格模式(技术栈:JavaScript)
function strictFunction() {
  "use strict";
  // 严格模式仅在此函数内生效
  let x = 10;
  console.log(x);
}

function nonStrictFunction() {
  // 非严格模式,允许某些松散行为
  y = 20; // 不会报错(但会污染全局作用域)
  console.log(y);
}

strictFunction();
nonStrictFunction();

二、严格模式的主要特性

1. 禁止隐式全局变量

在非严格模式下,如果变量未声明就直接赋值,JavaScript会默认创建一个全局变量。严格模式下,这种行为会直接报错:

// 示例:禁止隐式全局变量(技术栈:JavaScript)
"use strict";

function checkGlobalLeak() {
  leakedVar = "Oops!"; // ReferenceError: leakedVar is not defined
}

checkGlobalLeak();

2. 禁止删除变量、函数和函数参数

在非严格模式下,delete 操作符可以删除变量或函数,但严格模式下会抛出语法错误:

// 示例:禁止删除变量(技术栈:JavaScript)
"use strict";

let myVar = 100;
delete myVar; // SyntaxError: Delete of an unqualified identifier in strict mode

function myFunc() {}
delete myFunc; // SyntaxError

3. 函数参数不能重名

非严格模式下允许函数参数重名,但严格模式下会报错:

// 示例:禁止重复参数(技术栈:JavaScript)
"use strict";

function duplicateParams(a, a, b) { // SyntaxError: Duplicate parameter name not allowed
  console.log(a, b);
}

4. 禁止使用 with 语句

with 语句会降低代码可读性并可能导致作用域混乱,严格模式下直接禁用:

// 示例:禁止 with 语句(技术栈:JavaScript)
"use strict";

const obj = { x: 10 };
with (obj) { // SyntaxError: Strict mode code may not include a with statement
  console.log(x);
}

5. this 行为的改变

在非严格模式下,全局函数的 this 指向 window,而严格模式下指向 undefined

// 示例:严格模式下的 this(技术栈:JavaScript)
"use strict";

function checkThis() {
  console.log(this); // undefined
}

checkThis();

三、严格模式的实际应用场景

1. 避免意外的全局变量污染

严格模式强制变量必须先声明后使用,防止因拼写错误导致全局变量泄露:

// 示例:防止变量泄露(技术栈:JavaScript)
"use strict";

function calculateTotal(price, quantity) {
  total = price * quantity; // ReferenceError: total is not defined
  return total;
}

calculateTotal(10, 5);

2. 提高代码安全性

严格模式禁止 eval 在外部作用域引入变量,减少动态代码执行的风险:

// 示例:限制 eval 作用域(技术栈:JavaScript)
"use strict";

function safeEvalUsage() {
  let x = 10;
  eval("var y = 20;"); // y 不会泄露到外部作用域
  console.log(y); // ReferenceError: y is not defined
}

safeEvalUsage();

3. 优化性能

严格模式禁用了某些不利于引擎优化的语法(如 arguments.callee),使代码运行更高效:

// 示例:禁用 arguments.callee(技术栈:JavaScript)
"use strict";

function factorial(n) {
  if (n <= 1) return 1;
  return n * arguments.callee(n - 1); // TypeError: 'caller', 'callee', and 'arguments' may not be accessed
}

console.log(factorial(5));

四、严格模式的注意事项

  1. 谨慎全局启用:如果在大型项目中全局启用严格模式,可能会因为依赖的第三方库未适配严格模式而导致报错。
  2. 渐进式迁移:可以先在单个函数中启用严格模式,逐步覆盖整个项目。
  3. 浏览器兼容性:现代浏览器均支持严格模式,但在旧版IE(如IE9以下)可能存在兼容性问题。

五、总结

严格模式是JavaScript开发中的重要工具,它能帮助开发者编写更安全、更高效的代码。通过强制更严格的语法检查,避免了许多常见的编码错误。建议在新项目中默认启用严格模式,而在旧项目中逐步迁移。