为什么调用前要把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
部分):
w
比window
略短。 :-D
通过在该函数调用中使 w
成为局部变量,它在被引用时会在局部环境中找到,而不是 JavaScript 引擎必须寻找 window
在本地环境下,找不到,到外面环境去找。
至少在某些浏览器上 window
全局(我必须检查规范以查看是否指定)是一个访问器 属性,这意味着在 theory,每次引用它都是一个函数调用。所以 const w = window;
调用该函数一次并记住它的 return 值,而在任何地方使用 window
(理论上)重复调用该函数。但是在 JavaScript.
中函数调用确实 很快
(与将window
传入函数没有直接关系。)函数提供了一个私有作用域,用于将其他不需要访问的东西放在函数外部。
#4 可能是最有用的,正如我上面提到的,它与 window
方面并没有真正的关系,你可以在没有 window
/w
的情况下做同样的事情
在现代环境中,您可以通过使用模块获得#3,如果您想要#1 和#2,您可以使用 const w = 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);
对于我的一生,我不知道为什么。我注意到删除自调用函数和将每个对 w
的引用替换为 window
之间没有函数差异。进行这些更改并将所有内容替换为 window
是否有不利之处?它感觉更干净,并且与我的 IDE 工具配合使用效果更好。
谢谢!
在不使用现代模块的旧代码中,该策略(至少)有四个优点,三个非常小的优点和一个相当有用的优点(但仅与功能相关,与 window
部分):
w
比window
略短。 :-D通过在该函数调用中使
w
成为局部变量,它在被引用时会在局部环境中找到,而不是 JavaScript 引擎必须寻找window
在本地环境下,找不到,到外面环境去找。至少在某些浏览器上
中函数调用确实 很快window
全局(我必须检查规范以查看是否指定)是一个访问器 属性,这意味着在 theory,每次引用它都是一个函数调用。所以const w = window;
调用该函数一次并记住它的 return 值,而在任何地方使用window
(理论上)重复调用该函数。但是在 JavaScript.(与将
window
传入函数没有直接关系。)函数提供了一个私有作用域,用于将其他不需要访问的东西放在函数外部。
#4 可能是最有用的,正如我上面提到的,它与 window
方面并没有真正的关系,你可以在没有 window
/w
的情况下做同样的事情
在现代环境中,您可以通过使用模块获得#3,如果您想要#1 和#2,您可以使用 const w = window;
或类似的方法。