【问题标题】:Is it a good practice to wrap "strict mode" inside an IIFE (self-invoked) expression?将“严格模式”包装在 IIFE(自调用)表达式中是一种好习惯吗?
【发布时间】:2018-08-03 13:39:10
【问题描述】:

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


现在,我明白 Scope Closure 的用处(已回答 herehere) 或者可能更好的是,曾经如此流行的模块的有用性 设计方法以及为什么 IIFE 是一个如此强大的工具 (不仅)在这些情况下,但这不是这个问题 关于。

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

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

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

是否有为什么要将use strict; 保留在IIFE 中的任何依据,或者这只是没有正当理由提出的“毫无根据的反对意见”?

【问题讨论】:

  • IIRC 'use strict' 作为顶级声明使一切变得严格并且可以破坏第 3 方脚本
  • @JaredSmith ..如果这些第三方脚本与其中包含“use strict”的脚本之一捆绑在一起(如果具有“use strict”的脚本出现在第三方脚本之前。)

标签: javascript compiler-warnings strict strict-mode


【解决方案1】:

如果将多个脚本捆绑到一个文件中,则顶部的单个 "use strict"; 会使该文件中的 all 脚本代码严格,这可能会导致某些捆绑脚本出现问题,如果它们并非设计为在严格模式下工作。 (如果它们被不同的script 标签包含,这不是问题,只要它们被捆绑在一起。)

每当我打算使用 "use strict" 时,将代码包装在 IIFE 中是一种好习惯吗?

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2013-07-02
      • 1970-01-01
      • 2014-06-07
      相关资源
      最近更新 更多