【问题标题】:Why to wrap JS "window" into a self-calling function before calling?为什么要在调用之前将JS“窗口”包装成一个自调用函数?
【发布时间】:2021-11-22 18:16:51
【问题描述】:

我最近一直在代码库中工作,其中有许多 javascript 文件,部分是 angularJS、jQuery 和其他库。它已经存在了一段时间,我很好奇为什么 AngularJS 中的许多这些扩展方法或控制器都使用了一种特定的方法。

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

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

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

谢谢!

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

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

    1. wwindow 略短。 :-D

    2. 通过在该函数调用中将w 设为本地,当它被引用时,它会在本地环境中找到,而不是JavaScript 引擎必须在本地环境中寻找window,而不是找到它,然后出去外部环境找到它。

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

    4. (与将window 传递给函数没有直接关系。)该函数提供了一个私有范围,用于将其他不需要访问的东西放在函数之外。

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

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

    【讨论】:

    • 非常感谢! :) 我不确定与 #2 相关的成本,但我可能会查看它并发现使用 const w = window (或 _w 因为更易于搜索)可能有意义。我还开始对模块进行一些研究,看看我们如何将它们与 ngJS 一起使用——在尝试迁移到 Angular 之前采用其中的一些语法会很好!
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多