javascript 中立即调用的函数

Immediately Invoked functions in javascript

我在 javascript 中对使用 IIF 进行了澄清。 我已经下载了一个名为 test.js 的 javascript 文件,如下所示,在谷歌搜索 IIF 后我遇到了以下问题:

define(function () {

   (function (window) {

    this.test = function() {};

   Test.prototype.function1 = function(){
    //Do something
   },

   function Delete(){
   //Code to Delete
   }
   window.Delete = Delete;

   })(window);
});

我有以下问题:

  1. 是行, this.test = function() {}; 构造函数? 如果可以的话,我可以在一个文件中有 2 个构造函数,例如:

    this.test = function() {};
    this.test2 = function() {};
    

    而且,当我知道这是一个自动调用的文件时,为什么我需要一个构造函数,其中所有内容最初都是自己执行的。

  2. 这是私有函数吗?

    Test.prototype.function1 = function(){
      //Do something
    },
    

    这不是自动获取的吗?我是否需要创建一个测试对象然后调用它?

  3. 这是一个public函数吗?

    function Delete(){
        //Code to Delete
    }
    window.Delete = Delete;
    

    上面最后一行说的是。如果是这样,那么第一个和第二个函数有什么区别?

  4. 这里的关键词window是什么?

值得注意的是,此代码将失败并出现错误,因为 Test 未定义,并且您无法在 undefined 上设置 prototype 属性。

  1. 在JavaScript中,任何函数都可以是构造函数。这取决于你如何使用它。您可以将函数和属性添加到任何函数的 .prototype 属性 中,并且使用 new 从它创建的任何对象都将从原型链中获取它们。在您的情况下,this.test = function(){} 看起来不像原型。
  2. 在 JavaScript 中没有 "public" 或 "private" 函数这样的东西,只有通过 return 从函数中暴露出来的东西(或者在你的情况下,通过使用全局 window 对象,这被认为是不好的做法)如果 Test 函数暴露在某处,那么 Test.prototype.function1 也会暴露。所有原型方法都是"public".
  3. 是的,有点。正如我所说,"public" 或 "private" 与 JavaScript 无关。您创建了一个函数并将其放在全局的 window 对象上。本质上,您已将函数设为全局。
  4. window 是全局浏览器对象。虽然当像这样使用 (function(window) { ... })(window) 时,第一个 window 是参数的名称,(以及函数引用该参数的任何 window 实例,第二个(传递给函数调用)是全局 window 对象。

延伸阅读: