当前位置: 首页 > 面试题库 >

将整个Javascript文件包装在匿名函数(例如“(function(){…}}()”)中的目的是什么?

夏锐藻
2023-03-14
问题内容

最近,我阅读了很多Javascript,并且注意到整个文件的包装方式如下所示,在要导入的.js文件中。

(function() {
    ... 
    code
    ...
})();

为什么这样做而不是使用一组简单的构造函数呢?


问题答案:

通常是到名称空间(请参阅下文)并控制成员函数和/或变量的可见性。可以将其视为对象定义。它的技术名称是 立即调用函数表达式
(IIFE)。jQuery插件通常是这样写的。

在Javascript中,您可以嵌套函数。因此,以下是合法的:

function outerFunction() {
   function innerFunction() {
      // code
   }
}

现在您可以调用outerFunction(),但是的可见性innerFunction()仅限于的范围outerFunction(),这意味着它是私有的outerFunction()。它基本上遵循与Javascript中的变量相同的原理:

var globalVariable;

function someFunction() {
   var localVariable;
}

相应地:

function globalFunction() {

   var localFunction1 = function() {
       //I'm anonymous! But localFunction1 is a reference to me!
   };

   function localFunction2() {
      //I'm named!
   }
}

在上述情况下,您可以globalFunction()从任何地方拨打电话,但不能拨打localFunction1localFunction2

在编写时(function() { ...})(),您正在做的是使第一组括号内的代码成为函数文字(意味着整个“对象”实际上是一个函数)。之后,您将自动调用()刚刚定义的函数(最后一个)。因此,正如我前面提到的,此方法的主要优点是您可以拥有私有方法/函数和属性:

(function() {
   var private_var;

   function private_function() {
     //code
   }
})();

在第一个示例中,您将按globalFunction名称显式调用以运行它。也就是说,您只globalFunction()需要运行它即可。但是在上面的示例中,您不仅定义了一个函数,还定义了一个函数。您可以一口气定义和调用它。这意味着当您的JavaScript文件被加载时,将立即执行它。当然,您可以这样做:

function globalFunction() {
    // code
}
globalFunction();

除了一个显着的区别外,该行为基本上是相同的:您避免使用IIFE时污染全局范围(因此,这也意味着您不能多次调用该函数,因为它没有名称,但是由于该功能仅在确实不是问题后才可以执行)。

IIFE的整洁之处在于,您还可以在内部定义事物,并且只向外界公开想要的部件(例如,命名空间的示例,这样您就可以基本上创建自己的库/插件):

var myPlugin = (function() {
 var private_var;

 function private_function() {
 }

 return {
    public_function1: function() {
    },
    public_function2: function() {
    }
 }
})()

现在您可以打电话了myPlugin.public_function1(),但是您无法访问private_function()!因此非常类似于类定义。为了更好地理解这一点,我建议以下链接以供进一步阅读:

  • 命名Javascript
  • Javascript中的私有成员(由Douglas Crockford撰写)

编辑

我忘了提。在最后(),您可以在内部传递任何内容。例如,当您创建jQuery插件时,您传入jQuery$类似这样:

(function(jQ) { ... code ... })(jQuery)

因此,您在这里要做的是定义一个带有一个参数的函数(称为jQ,局部变量,仅对该函数已知)。那么你的自我调用函数,并传递一个参数(也叫jQuery,但是这一个是从外面的世界,并以实际的jQuery自身的引用)。这样做并没有紧迫的需求,但是有一些优点:

  • 您可以重新定义全局参数,并为其指定一个在本地范围内有意义的名称。
  • 性能上有一点优势,因为在本地范围内查找内容比在范围链中进入全局范围要快得多。
  • 压缩(缩小)有好处。

早先,我描述了这些函数如何在启动时自动运行,但是如果它们自动运行,谁传入参数?该技术假定您所需的所有参数均已定义为全局变量。因此,如果尚未将jQuery定义为全局变量,则此示例将不起作用。您可能会猜到,jquery.js在其初始化期间所做的一件事是定义了一个’jQuery’全局变量,以及它更为著名的’$’全局变量,该变量允许该代码在包含jQuery之后工作。



 类似资料:
  • 本文向大家介绍将整个JavaScript文件包装在匿名函数中的目的是什么?,包括了将整个JavaScript文件包装在匿名函数中的目的是什么?的使用技巧和注意事项,需要的朋友参考一下 包装的目的是命名空间并控制成员函数的可见性。它将代码包装在函数范围内,并减少与其他库的冲突。这就是我们所说的立即调用函数表达式(IIFE)或自执行匿名函数。 语法 这是语法- 如上所示,以下一对括号将括号内的代码转换

  • 本文向大家介绍什么是JavaScript中的匿名函数?,包括了什么是JavaScript中的匿名函数?的使用技巧和注意事项,需要的朋友参考一下 函数表达式与函数声明相似,并且具有与函数声明相同的语法。可以定义“命名”函数表达式(例如,在调用堆栈中可能使用表达式的名称)或“匿名”函数表达式。 匿名函数表达式的示例(未使用名称)- 可以使用引用该函数的变量名来调用此函数- 总之,匿名函数是未存储但与变

  • 本文向大家介绍什么是JavaScript中的自调用匿名函数?,包括了什么是JavaScript中的自调用匿名函数?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,用括号括起来的函数称为“立即调用函数表达式”或“自执行函数”。 包装的目的是为了命名空间并控制成员函数的可见性。它将代码包装在函数范围内,并减少了与其他库的冲突。这就是我们所说的立即调用函数表达式(IIFE)或自执行匿

  • 本文向大家介绍JavaScript的自执行匿名函数中的这个问题是什么?,包括了JavaScript的自执行匿名函数中的这个问题是什么?的使用技巧和注意事项,需要的朋友参考一下 假设这是一个示例代码段,我们需要告诉该代码段可能的输出并为其提供解释 让我们以幼稚的方式逐一解决这个问题 1→'Zakir'存储在变量名中 3→我们进入一个自执行的匿名函数 4→变量名称重新初始化为“ Rahul” 5→遇到

  • 本文向大家介绍使用匿名函数的JavaScript封装,包括了使用匿名函数的JavaScript封装的使用技巧和注意事项,需要的朋友参考一下 面向对象的编程语言允许使用私有字段隐藏数据。他们使用这些来隐藏类的内部。在JS中,没有这样的构建支持来隐藏/封装内部工作。 我们有Anonymous函数,可以为您封装JS。让我们看一个例子- 示例 如果我们将上面的代码公开地写出来,则此代码将使用这些名称污染全

  • 问题内容: 我有一个包含方法的对象。这些方法被放入匿名函数内部的对象中。看起来像这样: (还有很多代码,但这足以显示问题) 现在,在某些情况下,我想停止事件监听器。因此,我试图做一个removeEventListener,但我不知道如何去做。我已经读过其他问题,无法在匿名函数上调用removeEventListener,但是在这种情况下也是如此吗? 我在匿名函数内部创建了一个t方法,因此我认为这是