【js篇】"use strict" 指令详解:JavaScript 严格模式的意义与应用

72 阅读4分钟

在现代 JavaScript 开发中,"use strict"; 是一个非常重要的指令,它开启了所谓的“严格模式”。了解其含义、作用以及与普通模式的区别,对于编写更加安全、高效的代码至关重要。


✅ 一句话总结

"use strict"; 是一种用于指示 JavaScript 编译器以严格模式执行代码的声明。相比普通模式,它增强了安全性、避免了潜在错误,并且优化了性能。


✅ 一、什么是 "use strict"?

🔹 定义

  • "use strict"; 是一个字面量表达式,出现在脚本或函数的顶部。
  • 它不是一条语句,而是一个编译指示(Directive Prologue),告诉 JavaScript 引擎启用严格模式来解析和执行后续代码。

🔹 使用方式

  1. 全局范围:将 "use strict"; 放置在脚本文件的第一行。

    "use strict";
    // 整个脚本都将遵循严格模式规则
    
  2. 局部范围:放置在函数内部的第一行,仅对该函数有效。

    function strictFunction() {
      "use strict";
      // 仅该函数遵循严格模式规则
    }
    

✅ 二、严格模式下的主要变化

🔹 1. 禁止使用未声明的变量

// 普通模式下不会报错
a = 5; // a 自动成为全局变量

// 严格模式下会抛出 ReferenceError
"use strict";
b = 5; // Uncaught ReferenceError: b is not defined

🔹 2. 禁止删除变量或函数

"use strict";
var x = 42;
delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.

🔹 3. 静态绑定 this

  • 在非严格模式下,当函数内的 thisundefined 或者是全局对象时,this 会被自动转换为全局对象(如 window);
  • 在严格模式下,this 的值保持不变,如果未定义则为 undefined
function testThis() {
  console.log(this);
}

// 普通模式下输出 window 对象
testThis(); // Window {...}

// 严格模式下输出 undefined
(function() {
  "use strict";
  testThis(); // undefined
})();

🔹 4. 禁止八进制数字语法

// 普通模式允许八进制数字(尽管不推荐)
var num = 010; // 等于8

// 严格模式禁止八进制数字
"use strict";
var num = 010; // SyntaxError: Octal literals are not allowed in strict mode.

🔹 5. 函数参数限制

  • 不允许重复的参数名称;
  • 如果存在重复参数名,在严格模式下会抛出 SyntaxError
// 普通模式下不会报错
function func(a, a) { } // 警告但不报错

// 严格模式下会报错
"use strict";
function func(a, a) { } // SyntaxError: Duplicate parameter name not allowed in this context

🔹 6. 更严格的 eval() 行为

  • 在严格模式下,eval() 创建的新变量不会污染外部作用域。
// 普通模式下 eval 内的变量会影响外部作用域
var x = 10;
eval("var x = 20");
console.log(x); // 输出 20

// 严格模式下 eval 内的变量不会影响外部作用域
"use strict";
var y = 10;
eval("var y = 20");
console.log(y); // 输出 10

✅ 三、为什么应该使用 "use strict"?

🔹 提高代码安全性

  • 防止意外创建全局变量;
  • 禁止不当使用 this
  • 增强对变量和属性的访问控制;

🔹 提升代码质量

  • 避免常见错误,如拼写错误导致的未定义变量;
  • 更清晰的语法限制,减少模糊性和不确定性;
  • 促进更好的编程习惯;

🔹 性能优化

  • 严格模式下的某些特性可以被引擎更好地优化;
  • 减少了运行时检查的需求,提高了执行效率;

✅ 四、普通模式 vs 严格模式:对比示例

🔹 示例 1:未声明变量

// 普通模式
x = 5; // 全局变量
console.log(window.x); // 5

// 严格模式
"use strict";
y = 5; // ReferenceError: y is not defined

🔹 示例 2:函数内的 this

// 普通模式
function testThis() {
  console.log(this); // Window {...}
}
testThis();

// 严格模式
"use strict";
function testThisStrict() {
  console.log(this); // undefined
}
testThisStrict();

🔹 示例 3:重复参数名

// 普通模式
function func(a, a) { } // 仅警告

// 严格模式
"use strict";
function funcStrict(a, a) { } // SyntaxError: Duplicate parameter name not allowed in this context

✅ 五、一句话总结

"use strict"; 指令通过增强的安全性、更严格的语法规范以及潜在的性能提升,帮助开发者编写更健壮、可维护的 JavaScript 代码。建议所有新项目都采用严格模式。


💡 最佳实践

  • 始终开启严格模式:无论是新项目还是旧项目的重构,都应该考虑使用严格模式;
  • 模块化开发:ES6 模块默认处于严格模式,无需显式声明;
  • 注意兼容性:虽然几乎所有现代浏览器都支持严格模式,但在处理遗留代码时仍需谨慎;
  • 利用工具链:使用 ESLint 等工具强制执行严格模式,确保一致性;