31

我应该对我编写的每个 javascript 函数都“使用严格”吗?

在大型 AngularJS 项目中使用 strict 的好习惯是什么?在全局范围内使用它可能会破坏不支持它的第三方库,但每次都“使用严格”只是重复很多。

4

4 回答 4

25

在这个问题上,请注意过度简化的普遍趋势。

首先,您的所有代码绝对应该在严格模式下运行。通过在严格模式之外执行代码来更改核心现代 JavaScript 功能(请参阅.call() 和 apply())或毁容(静默错误)。(更多关于这个来自克罗克福德。)

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

在浏览器中,您的代码应在缩小后交付。如果你包含'use strict'在每个函数体中,你的压缩器不会把它去掉,你会浪费字节在任何地方重复它。您只需要在最外层的函数范围内使用它——在模块定义的顶部。一种方法是将您的缩小代码包装在一个 IIFE 闭包中,作为构建过程的一部分:

;(function (){ 
  'use strict'
  // All code here.
}())

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

当然,在服务器上,它要简单得多。代码没有被缩小,字节也不重要,所以你可以use strict在每个文件的顶部包含指令。

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

于 2015-12-16T01:18:40.317 回答
14

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

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

1:我什至主张在全局范围内启用它,因为严格模式不应该破坏任何正确编写的代码。
如果它确实破坏了第三方脚本,解决方案可能不是再次禁用严格模式......</sub>

于 2015-12-16T00:18:52.727 回答
7

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

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

})();
于 2015-12-16T00:20:29.113 回答
4

不,冗余不是必需的。声明的使用

"use strict";

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

文件级自执行函数

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

(function () { 
    ...
}())

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

更多关于申报范围

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

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

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

为什么要严格模式?

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

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


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

你可以放置

"use strict";

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

其他代码行在这里的代码中还有其他用途。

  • 自调用函数
  • 工厂调用

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

于 2017-02-09T18:49:38.727 回答