JavaScript 中的“use strict”起什么作用,其背后的原因是什么?

最近,我通过 Crockford 的JSLint运行了一些 JavaScript 代码,但出现了以下错误:

第 1 行第 1 个字符处存在问题:缺少“use strict”语句

经过一番搜索,我发现有些人会"use strict";在他们的 JavaScript 代码中添加此语句。一旦我添加了该语句,错误就不会再出现。不幸的是,Google 并没有透露此字符串语句背后的太多历史。当然,这肯定与浏览器如何解释 JavaScript 有关,但我不知道会产生什么影响。

那么"use strict";,这到底是什么?这意味着什么?它是否仍然有意义?

当前的浏览器是否响应该"use strict";字符串或者是否供将来使用?

阅读 352
avatarAI BotBETA

答案:

1. 什么是 "use strict"?
"use strict" 是 ES5 (2009) 引入的指令,用于启用 JavaScript 的严格模式(Strict Mode)。它是一个编译指示(pragma),要求引擎以更严格的语法和行为规则执行代码。

2. 严格模式的作用

  • 捕获常见错误:将隐式错误转为显式抛出(例如未声明变量赋值)。
  • 禁止不安全操作:如删除变量、函数参数重复、使用 eval 创建作用域等。
  • 优化代码:帮助引擎更好地优化代码(例如禁止 with 语句)。
  • 面向未来:预留 ES6+ 关键字(如 class, let),避免未来语法冲突。

3. 关键行为变化示例

// 示例 1:未声明变量赋值(报错)
function demo() {
  "use strict";
  x = 10; // ReferenceError: x is not defined
}

// 示例 2:删除不可删除的属性(报错)
delete Object.prototype; // TypeError

// 示例 3:重复参数名(报错)
function sum(a, a) { 
  "use strict";
  // SyntaxError: Duplicate parameter name
}

4. 历史背景

  • ES3 的设计缺陷:早期 JavaScript 允许松散语法,导致潜在错误(如拼写错误变为全局变量)。
  • 渐进增强:严格模式是向后兼容的过渡方案,开发者可逐步采用。

5. 浏览器支持与现状

  • 现代浏览器全面支持(IE10+)。
  • 旧浏览器:会忽略 "use strict",以非严格模式运行代码。
  • 仍推荐使用:尤其是新项目或 ES6+ 代码(模块默认启用严格模式)。

6. 是否仍有意义?

  • 新项目:建议使用,提升代码质量。
  • 旧代码迁移:需测试是否依赖非严格模式行为(如 arguments.caller)。
  • 工具链:Webpack/Babel 等工具可能自动插入 "use strict"。

总结
Crockford 的 JSLint 强制要求 "use strict" 是出于代码质量规范。严格模式并非“未来功能”,而是已被广泛采用的现代 JS 开发标准实践。

推荐问题
宣传栏