【问题标题】:Javascript's "strict mode" in production [duplicate]生产中的Javascript“严格模式”[重复]
【发布时间】:2015-03-02 01:11:57
【问题描述】:

我最近在 JavaScript 中遇到了“严格模式”。我知道严格模式对于让程序员以正确的方式编写 JavaScript 非常重要。我的问题是,将脚本放到网上时删除“严格模式”会带来更好的“稳定性”吗?这样做是个好习惯吗?另外,“严格模式”是否有助于提高网络应用的性能?

【问题讨论】:

  • 严格模式适用于开发人员,它对性能或用户没有任何作用。有许多浏览器不支持严格模式,所以不要依赖它是否可用。确保以严格模式编写的代码也可以在非严格模式下运行。
  • 想象一个用户做了一些你从未测试过的事情,在这种特殊情况下,你滥用了 use strict 可能已经发现的东西。此外,还有一些模糊的情况,非严格模式的行为不同。在任何一种情况下,use strict 都会很有用。由于它不会影响性能,因此我不确定将其去除的动机是什么。

标签: javascript


【解决方案1】:

理论上 - 在草率模式下运行会导致错误

移除严格模式会改变语言的语义,并且可能会给在严格模式下开发的大型代码库引入细微的错误。例如,arguments 对象在严格模式下的行为不同,this 在基元上调用方法时也是如此,因此依赖于其中任何一个的代码都会中断。

行为发散的一些例子:

(function(){ console.log(typeof this === "object") }).call(5); // logs true
(function(){ "use strict"; console.log(typeof this === "object") }).call(5); // false

(function(x){  arguments[0] = 3; console.log(x) })(5); // logs 3
(function(x){ "use strict"; arguments[0] = 3; console.log(x) })(5); // logs 5

实际上并没有那么糟糕

这些边缘情况中的大多数都是您无论如何都不应该遇到的。严格模式有利于捕捉隐式声明全局变量并将全局对象分配为this 等错误。如果您的代码在 IE9 上运行,它无论如何都不能使用严格模式,它在 IE9 中以草率模式运行,而在较新的浏览器上以严格模式运行。我个人在 IE9 上以草率模式运行多个此类代码库,并在严格模式下运行其他浏览器,因此我从未遇到过实际错误。

关于性能

严格模式通过使 arguments 表现良好并禁止使用来删除“动态范围”,因此它应该通过删除一整层查找来更快地执行 - 据说现代浏览器可以解决这种事情在他们的 on 所以你不应该感觉到很大的性能差异。严格模式的主要优点是它有助于防止细微的错误。

【讨论】:

  • 非常感谢您的回答。那么这是否意味着,开启严格模式,IE 8、9 等旧浏览器的行为会有所不同并造成麻烦?
  • @user1995781 是的——它们的行为会有所不同,理论上会因为语义不同而引起麻烦。在实践中:您最后一次分配给arguments 或在原语上使用.call 是什么时候?语义变化在合理的代码库中大多是无害的,尽管它们肯定存在。
  • 另外,你最后一次写if (typeof this == 'undefined')是什么时候?在严格模式下编写的代码无论如何都必须在非严格模式下运行,所以应该以这种方式进行测试(所以如果你使用的是一个好的 linter,那么严格模式有什么意义呢?)。
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 2013-01-31
  • 2014-08-13
  • 1970-01-01
  • 2021-05-23
  • 2018-09-02
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多