为什么通常在IIFE之后(而不是在脚本的顶部)"使用严格"?

Kay*_*ues 3 javascript

我有趣地注意到这use strict似乎更常见:

(function() {
  'use strict';
  ...
Run Code Online (Sandbox Code Playgroud)

比这个:

'use strict';
(function() {
  ...
Run Code Online (Sandbox Code Playgroud)

例如,TodoMVCvanilla JS实现就是这样做的.

是否有一个原因?

编辑:我知道整个文件与功能块的区别.TodoMVC是一个很好的例子来证明为什么这个位置对我来说很奇怪,因为它不依赖于任何外部库,所以整个"与非严格的第三方玩得很好"在这里不适用.

Ray*_*yon 7

local范围内声明它将强制执行功能块以供strict-mode浏览器考虑.

您可以non-strict观察其他代码IIFE


内部IIFE:

(function() {
  "use strict";
  a = 100;
})();
b = 200;
Run Code Online (Sandbox Code Playgroud)


对于整个脚本:

"use strict";
(function() {
  try {
    a = 100;
  } catch (e) {
    console.log(e + '');
  }

})();
b = 200;
Run Code Online (Sandbox Code Playgroud)

正如文档中所强调的,

如果您strict对整个脚本使用模式,则无法盲目连接非冲突脚本.考虑将严格模式脚本与非严格模式脚本连接起来:整个连接看起来很严格!反之亦然:非严格加严格看起来非严格.严格模式脚本相互连接很好,并且非严格模式脚本的连接也很好.只连接严格和非严格的脚本是有问题的.因此,建议您逐个功能地启用严格模式(至少在过渡期间).

您还可以采用在函数中包装脚本的全部内容并使该外部函数使用严格模式的方法.这消除了连接问题,但这意味着您必须显式地从函数范围中导出任何全局变量.