为什么调用前要把JS"window"包装成自调用函数?

Why to wrap JS "window" into a self-calling function before calling?

我最近在一个代码库中工作,其中有许多 javascript 文件,部分 angularJS、jQuery 和其他库。它已经存在了一段时间,我很好奇为什么在 AngularJS.

中对这么多扩展方法或控制器使用了一种特定的方法

因此,每次创建一个新的 AngularJS 对象时,它都被包裹在一个自调用函数中:

(function (w) {
  w.app.controller('ctrlName', function ($scope, $ngJSdependency, myOwnDependency) { 
   w.GlobalFunctions.exampleCallGlobalFunction();
   $scope someData = w.GlobalData.someData;
  }); 
})(window);

对于我的一生,我不知道为什么。我注意到删除自调用函数和将每个对 w 的引用替换为 window 之间没有函数差异。进行这些更改并将所有内容替换为 window 是否有不利之处?它感觉更干净,并且与我的 IDE 工具配合使用效果更好。

谢谢!

在不使用现代模块的旧代码中,该策略(至少)有四个优点,三个非常小的优点和一个相当有用的优点(但仅与功能相关,与 window部分):

  1. wwindow略短。 :-D

  2. 通过在该函数调用中使 w 成为局部变量,它在被引用时会在局部环境中找到,而不是 JavaScript 引擎必须寻找 window在本地环境下,找不到,到外面环境去找。

  3. 至少在某些浏览器上 window 全局(我必须检查规范以查看是否指定)是一个访问器 属性,这意味着在 theory,每次引用它都是一个函数调用。所以 const w = window; 调用该函数一次并记住它的 return 值,而在任何地方使用 window (理论上)重复调用该函数。但是在 JavaScript.

    中函数调用确实 很快
  4. (与将window传入函数没有直接关系。)函数提供了一个私有作用域,用于将其他不需要访问的东西放在函数外部。

#4 可能是最有用的,正如我上面提到的,它与 window 方面并没有真正的关系,你可以在没有 window/w 的情况下做同样的事情

在现代环境中,您可以通过使用模块获得#3,如果您想要#1 和#2,您可以使用 const w = window; 或类似的方法。