JavaScript 匿名构造函数:!function(){}();

Vad*_*Vad 5 javascript constructor function

我见过在 JavaScript 中创建匿名构造函数的语法:

var Application = Application || {};
!function(window, Application) {
   Application.property = {/*...*/}
   Application.method = function(){/*...*/}
}(window, Application);
Run Code Online (Sandbox Code Playgroud)

我想了解以下部分:

  1. var o = o || {};使用第一行(即)与仅说明相比有什么优势var o = (function(){})();
  2. 为什么!用在函数前面?
  3. 当它们是全局对象时,为什么我要传递windowor作为参数?Application
  4. 这是匿名构造函数最方便的方法吗?这比以下方法更好:

4a)

 var Application = { 
    property: {},
    method: function(){}
 }
Run Code Online (Sandbox Code Playgroud)

或 4b)

 var Application = (function() {
    var method = function(){/*...*/}
    return {method:method};
 }());
Run Code Online (Sandbox Code Playgroud)

Sco*_*ica 2

第一行是确保Application始终存在,通常用于预期Application应该存在的情况,并且该函数只是增强现有对象。如果它不存在,这可以确保我们在访问未定义的属性时不会收到错误。Application您的示例仅在还不存在的情况下等效。在所有其他情况下,您的代码将消除现有的Application,这几乎肯定不是意图。

Vatev 的评论解释了它的作用!。这是使相关函数成为自执行匿名函数的另一种语法。(顺便说一句,它还获取函数的返回值 - 当前为undefined,并翻转其真实性,因此计算结果为 true。不过,由于结果未存储在任何变量中,这显然不是目的。)

最后,为什么将windowand传递Application到函数中并在那里使用它?这是一项安全功能,以防其他代码更改windowApplication稍后更改。它保证在匿名函数中,window并且Application正是您所期望的。在您给出的速记示例中,这可能看起来并不重要 - 毕竟,如果您立即使用这些变量而不存储它们,为什么要保护它们呢?在许多情况下,您从该函数返回一些内容,然后将windowApplication存储在闭包中,因此您将保留变量。这使得后来决定说出来的人感到安全Application = {...}