当前位置: 首页 > 知识库问答 >
问题:

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

轩辕佑运
2025-02-27

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

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

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

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

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

共有3个答案

小牛23643
2025-02-27

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...

范彭亮
2025-02-27

参考:https://segmentfault.com/q/1010000042376263?utm_source=sf-similar-question

艾泽语
2025-02-27

答案:

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 开发标准实践。

 类似资料:
  • 问题内容: 最近,我通过Crockford的JSLint运行了一些JavaScript代码,它给出了以下错误: 第1行第1个字符处的问题:缺少“使用严格”语句。 通过搜索,我意识到有些人将其代码添加到了JavaScript中。添加语句后,错误停止出现。不幸的是,谷歌没有透露此字符串语句背后的许多历史。当然,它一定与浏览器如何解释JavaScript有关,但是我不知道会有什么影响。 那么到底是什么,

  • 我对编程很陌生,我已经自学了将近一个月了,有谁能给我解释一下我代码中错误的原因吗?在“Total(moneyConv(moneySum*moneyRate))”中出错。行,表示实际和形式的论点在长度上是不同的。我检查了我所有的参数,我觉得很好。多谢!

  • 问题内容: 接口隔离原理(ISP)说,许多客户端特定的接口比一个通用接口好。为什么这很重要? 问题答案: ISP指出: 不应强迫客户依赖他们不使用的方法。 ISP与重要特性- 内聚和耦合有关。 理想情况下,您的组件必须高度定制。它提高了代码的健壮性和可维护性。 实施ISP可为您带来以下好处: 高内聚性 -更好的易懂性,鲁棒性 低耦合 -更好的可维护性,高抗变化性 如果您想了解有关软件设计原理的更多

  • 问题内容: 关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException 的原因和处理InterruptedException。但是,它们都没有告诉我InterruptedException的可能来源。 像SIGTERM,SIGQUIT,SIGINT这样的OS信号呢?在命令行上按CTRL-C是否会产生InterruptedE

  • 问题内容: 我看过一些D3代码,它们带有类似这样的模式,用于附加元素: 我真的不明白这个片段。为什么选择null?我对D3的理解方式是,如果要添加圆,则应为: 同样,如果要追加HTML段落,则应该为: 类也是如此:如果将元素添加到类中foo,则应该为。 但是, 确实有效!元素被追加。那么,这是什么意思null呢?我在这里想念什么? 注意:这是一个自我回答的问题,试图提供一个针对该主题的“规范”问答

  • 问题内容: C#和Java都定义 易失性读取具有获取语义 易失性写入具有释放语义 我的问题是: 这是定义volatile的唯一正确方法。 如果没有,如果语义相反,情况会完全不同,即 易失性读取具有释放语义 易失性写入具有语义 问题答案: 获取/释放语义的作用并不在于其他线程多久才能看到volatile字段本身的新写入的值,而在于易失性操作在不同线程之间建立事前联系的方式。如果线程A读取了一个vol

  • 问题内容: 在Java中,可以使用 AtomicMarkableReference 原子地更新对象引用以及标记位。 该javadoc的状态: 实施注意事项:此实现通过创建表示“装箱的” [reference,boolean]对的内部对象来维护可标记的引用。 根据在该类的Java 8源代码中可以看到的情况,这是正确的: 该类的get方法的设计背后是否有原因? 使用这种布尔数组(而不是返回值对)有什么

  • 这里已经阐明了和之间的区别。 但我的问题是,为什么我们要使用关键字?从生成的Java代码角度来看没有区别。 静态编程语言代码: 生成: