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

IT技术 javascript syntax jslint use-strict
2021-01-15 00:10:01

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

第 1 行字符 1 的问题:缺少“use strict”语句。

做了一些搜索,我意识到有些人添加"use strict";到他们的 JavaScript 代码中。添加语句后,错误不再出现。不幸的是,谷歌没有透露这个字符串语句背后的大部分历史。当然,它肯定与浏览器如何解释 JavaScript 有关系,但我不知道会产生什么效果。

那么到底是"use strict";什么,它意味着什么,它仍然相关吗?

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

6个回答

ES6 module的更新

原生 ECMAScript module(带有importexport语句)和ES6 类中,严格模式始终处于启用状态且无法禁用。

原答案

这篇关于 Javascript 严格模式的文章可能会让您感兴趣:John Resig - ECMAScript 5 严格模式、JSON 等

引用一些有趣的部分:

严格模式是 ECMAScript 5 中的一项新功能,它允许您将程序或函数置于“严格”操作上下文中。这种严格的上下文会阻止执行某些操作并引发更多异常。

和:

严格模式有以下几个方面的帮助:

  • 它捕获一些常见的编码错误,抛出异常。
  • 当采取相对“不安全”的操作(例如获得对全局对象的访问权)时,它会阻止或抛出错误。
  • 它禁用令人困惑或考虑不周的功能。

另请注意,您可以将“严格模式”应用于整个文件......或者您可以仅将其用于特定功能(仍然引用 John Resig 的文章)

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

如果您必须混合旧代码和新代码,这可能会有所帮助;-)

所以,我想它有点像"use strict"您可以在 Perl 中使用的(因此得名?):它通过检测更多可能导致损坏的东西来帮助您减少错误。

现在所有主要浏览器都支持严格模式

这是 ECMAScript 5 的一个新特性。John Resig 写了一篇很好的总结

它只是您放入 JavaScript 文件(位于文件顶部或函数内部)的字符串,如下所示:

"use strict";

现在将它放入您的代码中不会对当前浏览器造成任何问题,因为它只是一个字符串。如果您的代码违反了编译指示,将来可能会导致您的代码出现问题。例如,如果您目前foo = "bar"没有foo定义,您的代码将开始失败……在我看来这是一件好事。

该语句"use strict"; 指示浏览器使用 Strict 模式,这是一种简化且更安全的 JavaScript 功能集。

功能列表(非详尽)

  1. 禁止全局变量。(捕获var变量名称中缺少的声明和拼写错误)

  2. 静默失败的分配将在严格模式下引发错误(分配NaN = 5;

  3. 尝试删除不可删除的属性将抛出 ( delete Object.prototype)

  4. 要求对象字面量中的所有属性名称都是唯一的 ( var x = {x1: "1", x1: "2"})

  5. 函数参数名称必须唯一 ( function sum (x, x) {...})

  6. 禁止八进制语法(var x = 023;一些开发人员错误地认为前面的零不会改变数字。)

  7. 禁止with关键字

  8. eval 在严格模式下不会引入新变量

  9. 禁止删除普通名称 ( delete x;)

  10. 禁止或名称的分配结合evalarguments以任何形式

  11. 严格模式不arguments使用形式参数对象的属性设置别名(例如,在function sum (a,b) { return arguments[0] + b;}This work because arguments[0]is bound toa等等。)

  12. arguments.callee 不支持

[参考:严格模式Mozilla 开发者网络]

11.的例子不清楚,也不清楚严格模式的区别是什么。
2021-04-02 00:10:01

如果人们担心使用use strict它可能值得查看这篇文章:

浏览器中的 ECMAScript 5 '严格模式' 支持。这是什么意思?
NovoGeek.com - 克里希纳的博客

它讨论了浏览器支持,但更重要的是如何安全地处理它:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

提醒各位辛苦的程序员:应用"use strict"到现有代码可能是危险的!这东西不是什么让人感觉良好、面带笑容的贴纸,您可以贴在代码上使其“更好”。使用"use strict"pragma,浏览器会突然在随机的地方抛出异常,而这些地方以前从未抛出过,因为在那个地方你正在做一些默认/松散的 JavaScript 高兴地允许但严格的 JavaScript 憎恶的事情!您可能在代码中很少使用的调用中隐藏了严格性违规,这些调用只会在它们最终运行时抛出异常 - 例如,在您的付费客户使用的生产环境中!

如果您打算冒险,最好"use strict"与全面的单元测试和严格配置的 JSHint 构建任务一起应用,这将使您确信module的黑暗角落不会仅仅因为您已开启严格模式。或者,嘿,这是另一种选择:只是不要添加"use strict"到您的任何遗留代码中,老实说,这样可能更安全。 绝对不要添加"use strict"到您不拥有或维护的任何module,如第三方module。

我认为即使它是一种致命的笼中动物,"use strict"也可以是好东西,但你必须做得对。严格执行的最佳时间是当您的项目处于绿地并且您从头开始时。配置JSHint/JSLint所有警告和选项,尽您的团队所能承受的范围,获得一个良好的构建/测试/断言系统Grunt+Karma+Chai,然后像"use strict". 准备好解决许多琐碎的错误和警告。如果JSHint/JSLint产生任何违规,则通过将构建配置为 FAIL 来确保每个人都了解严重性

当我采用"use strict". 结果,我的 IDE 充满了红色标记,因为我的"use strict"一半module都没有,而 JSHint 对此表示不满。这是对我未来应该进行哪些重构的提醒。由于我所有遗漏的"use strict"陈述,我的目标是免于红印,但那是几年之后的事了。