将 "strict mode" 包装在 IIFE(自调用)表达式中是一种好习惯吗?

Is it a good practice to wrap "strict mode" inside an IIFE (self-invoked) expression?

我有一个非常简单的问题要问:
每当我打算使用“use strict”时,将代码包装在 IIFE 中是一个好习惯吗?


现在,我明白了作用域闭包的用处 (已回答 herehere) 或者可能更好的是,曾经如此流行的模块的用处 设计方法以及为什么 IIFE 是一个如此强大的工具 (不仅)在这些场景中,但这不是这个问题的意思 关于。

我注意到,大多数 linters (包括 jsfiddle) 确实倾向于在你想在全局范围内使用严格模式时抱怨:

将块包装在 IIFE 中似乎可以阻止 linter 抱怨

(function(){
 "use strict";
 console.log("I compiled!");
})();

是否有 任何基础说明为什么 use strict; 应该保留在 IIFE 中,或者这只是一个没有正当理由的 "baseless objection" ?

如果多个脚本一起捆绑到一个文件中,顶部的单个 "use strict"; 会使该文件中的 所有 脚本代码变得严格,这可能会导致问题对于一些捆绑的脚本,如果它们不是为在严格模式下工作而设计的。 (如果它们包含在不同的 script 标签中,这不是问题,前提是它们是捆绑在一起的。)

Is it a good practice to wrap code inside an IIFE whenever I intend on using "use strict" ?

如果您使用的是捆绑器,可能。如果没有,那也没关系。但是,随着 ES2015 的 modules 得到更好的支持,使用模块(您现在可以使用 bundlers 来做)将是一个更好的选择,并且不需要 "use strict" 指令(ES2015+ 模块代码总是严格的)。

我认为这是因为当 use strict 被全局定义时,您最终将迫使所有第 3 方引用无法正常工作,除非它们也很严格。 现在因为你没有能力保证所有加载的资源都使用严格,你有引起麻烦的危险......

在范围内使用 "strict" 意味着范围的所有者有责任知道他的代码是否支持严格