为什么要在调用之前将 JS "window"包装到自调用函数中?



我最近一直在一个代码库中工作,其中有许多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 工具配合得更好。

谢谢!

在不使用现代模块的旧代码中,该策略(至少)有四个优点,三个非常次要的优点和一个相当有用的优点(但仅与函数有关,而不是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;或类似的。

最新更新