我应该为我写的每一个javascript函数'使用严格'吗?

Won*_*Bae 24 javascript strict-mode

我应该为我写的每一个javascript函数'使用严格'吗?

在大型AngularJS项目中使用strict的好习惯是什么?在全球范围内使用它可以打破不支持它的第三方库,但每次都"严格使用"只是重复次数.

jef*_*han 17

在这个问题上,要注意过度简化的一般倾向.

首先,所有代码绝对应该以严格模式运行.核心现代javascript功能通过执行严格模式之外的代码而更改(请参阅.call()和apply())或disfigured(silent Errors).(更多关于这一点,来自Crockford.)

但是,这并没有解决您应该如何确保代码以严格模式运行的方式.至少有两种情况需要考虑:

在浏览器中,您的代码应在缩小后传递.如果你包含'use strict'在每个函数体中,你的minifier将不会将它剥离出来,并且你将浪费在任何地方重复它的字节.您只需要在最外面的函数范围中 - 在模块定义的顶部.一种方法是将缩小的代码包装在单个IIFE闭包中作为构建过程的一部分:

;(function (){ 
  'use strict'
  // All code here.
}())
Run Code Online (Sandbox Code Playgroud)

我认为这接近理想的做法,但它或多或少地要求你采用持续集成工作流程(因为,为了观察你的代码在严格模式下运行,你必须把它全部包裹起来一个闭包) .如果不以这种方式工作,则必须将use strict指令包含在未在另一个函数范围内声明的每个函数的顶部.

当然,在服务器上,它更简单.代码不会缩小,字节无关紧要,因此您只需将use strict指令包含在每个文件的顶部即可.

警告--use_strict:如果您控制脚本的运行方式,您可能会发现自己很想使用--use_strict运行时标志.这很简单,但这意味着所有依赖项必须符合严格模式.由于您无法控制每个第三方的合规性,因此这通常是不明智的.

  • 假设你的js文件被附加到另一个名为returnsFunc.js的文件中,该文件返回一个函数.然后你有一个函数值后跟'(function()...)',也就是说,你的文件被解释为returnFunc.js返回的函数的输入,并调用该函数.在那种情况下,没有什么能像预期的那样工作,并且调试将非常混乱.前缀分号消除了这种可能性. (6认同)

Ber*_*rgi 11

您编写的所有代码1 都应该处于严格模式.它可以帮助您通过不忽略异常来捕获错误.

但是,,这并不意味着您需要在"use strict";每个function定义前加上,您只应将它放在模块范围内 - 每个文件一次 - 以便它被所有函数继承.当你要切换到ES6模块时,无论如何都会暗示.

1:我甚至争论全局启用它,因为严格模式不应该破坏任何正确编写的代码.
如果它确实破坏了第三方脚本,解决方案可能不会再次禁用严格模式...


Pra*_*man 7

简短的回答,是的!您不需要为每个函数包含它,而是每个JavaScript文件只需添加一次.当你启动文件时,从这样的闭包开始:

(function () {
  "use strict";
  // Rest of your code.

})();
Run Code Online (Sandbox Code Playgroud)

  • 为什么?你可以把它放在文件的顶部而不需要自调用函数包装器. (2认同)
  • 是的,也是外部范围. (2认同)

Dou*_*eco 5

不需要。冗余是没有必要的。声明的使用

\n\n
"use strict";\n
Run Code Online (Sandbox Code Playgroud)\n\n

在文件或流范围内是更好的选择,特别是在使用第三方库的情况下。它有助于决定是按原样使用它们、包装它们还是继续使用它们。

\n\n

文件级自执行函数

\n\n

在自执行闭包中看到整个文件或流变得越来越常见。在这种情况下,使用严格模式的声明(上面)被插入到闭包的第一行,其中 ... 所在。

\n\n
(function () { \n    ...\n}())\n
Run Code Online (Sandbox Code Playgroud)\n\n

值得一提的是,自执行并不总是必要的,如果过度使用,实际上可能会导致负载缓慢和其他问题。

\n\n

有关声明范围的更多信息

\n\n

的范围取决于您将声明放置在函数内部还是外部,并且适用于闭包范围内声明后面的所有语句。

\n\n

如果所有文件或流已经与更严格的模式兼容或者可以轻松实现,则在函数内部使用声明是错误的方法。冗余是不必要的,因此建议将声明放置在文件顶部或流的开头。

\n\n

有时只有部分功能符合更严格的规则。在这种情况下,可以使用声明的不太理想的函数范围来鼓励至少在已经符合要求的函数中进行更精细的编码实践。

\n\n

为什么要使用严格模式?

\n\n

严格模式消除了某些从语言设计角度来看不太理想的宽松语言解析和执行特性。这些非严格模式语言特征被视为谨慎的默认行为,以实现向后兼容性。概要和详细信息显示在此处。

\n\n\n\n

没有明确定义何时以及是否会弃用这些早期 Netscape 时代的旧语言特性,或者严格模式是否会在某个时候成为跨浏览器的默认行为,但更严格的模型可能会产生不那么模糊和危险的源代码。如果您希望提高编码实践和代码库的可维护性、可移植性和可扩展性,那么严格模式是一个不错的选择。

\n\n
\n\n

注意对于那些来自“在每个文件中使用“function() \'use strict\'\xe2\x80\x9d 有什么好处?”的人

\n\n

您可以放置

\n\n
"use strict";\n
Run Code Online (Sandbox Code Playgroud)\n\n

在代码序列的顶部或函数内部,因此每个文件或每个函数只有一行代码。

\n\n

此处代码中的其他代码行有其他用途。

\n\n
    \n
  • 自调用函数
  • \n
  • 工厂调用
  • \n
\n\n

有些将整个文件放入自动执行函数中,但这并不是在所有情况下都必需的。

\n