【问题标题】:What is this unknown JavaScript syntax?这个未知的 JavaScript 语法是什么?
【发布时间】:2011-05-26 20:52:40
【问题描述】:

这是 jQuery 代码吗

(function(jQuery){
})(jQuery);

相当于

$(document).ready(function () {
});

如果是,两者有什么区别?如果不是,第一个做什么?

编辑:

谢谢大家。大多数反应是相似的不同口味和样品

【问题讨论】:

  • 不是 jQuery 代码,而是 JavaScript 代码。 :)

标签: javascript jquery anonymous-function iife


【解决方案1】:

它们不相等。

您的第一个示例是Immediately-Invoked Function Expression (IIFE)。它围绕本地定义的变量创建一个闭包。

您的第二个示例指定了在DOM is fully loaded 时执行的函数。它用于确保 DOM 中的所有元素节点在执行包含的代码之前都是可用的。这也是一个闭包。

两个示例都使用匿名函数。

值得指出的是,使用您的两个示例是一种很好的做法,如下所示:

(function($){
    // locally-scoped, DOM-is-NOT-Ready-code here.
    $(function () {
        // your locally-scoped, DOM-is-ready-code here.
    });
}(jQuery)); // note that I've moved the invocation into the parens
            // that contain the function.  This makes JSLint happy!

【讨论】:

  • 您的代码示例可以简化为:jQuery(function($) { });
  • @Šime Vidas 更新了我的示例,以更清楚地说明我为什么要这样做。
【解决方案2】:

绝对不是,第一个是自执行匿名函数,第二个是ready 处理程序。

(function(jQuery){
  //jQuery in this scope is referencing whatever is passed-in
})(jQuery);

因此,函数内部的jQuery 不一定与函数外部的jQuery 相同。但是您通常不希望将全局变量名与本地变量名混合使用。

举个例子:

(function(obj) {
   alert(obj);
})('Hello');

这定义了一个函数,然后立即调用它,传入“Hello”

【讨论】:

    【解决方案3】:
    $(document).ready(function () {
    
    });
    

    等价于:

    $(function() {
    
    });
    

    第一个 sn-p 是一个立即调用的匿名函数,它创建一个本地范围:

    (function() {
        var x = 2;
    })();
    
    alert(x); // undefined
    

    【讨论】:

      【解决方案4】:

      没有。第一个实际上并没有做太多。只需将内部的所有变量与周围的范围分开,并在内部创建一个本地 jQuery 变量。

      第二个传递一个函数,该函数在 DOM 准备好之后运行(换句话说,在 <body> 加载之后)。

      常见的等价于:

      $(document).ready(function () {
      });
      

      是:

      $(function () {
      });
      

      做同样的事情。

      此时:

      (function(jQuery){
      })(jQuery);
      

      通常写成:

      (function($){
      })(jQuery);
      

      这样$ 变量就不再是全局变量了。如果全局 $ 变量已在使用中,则很有用。

      【讨论】:

        【解决方案5】:

        一点也不。第一个是闭包 - 您创建然后立即调用的函数。但是,通常您会像这样将两者结合起来:

        
          (function($) {
            // use the $ variable
            $(document).ready(function(){
              // ...
            });
          })(jQuery);
        

        通过创建闭包,您可以将“jQuery”重命名为“$”,只是在本地为该代码块。使用闭包语法的原因是您可以使用 $ 变量,即使它可能没有被定义为全局范围内的 jQuery 对象(即一些 JavaScript 框架,如原型使用 $ 作为变量)。

        每当您编写 jQuery 插件时,您都应该将所有 jQuery 代码包含在这种闭包中,这样它就不会干扰任何其他 JavaScript 框架。如果您不编写插件并且不使用任何其他 JavaScript 框架,您可能不必费心将代码封装在闭包中。

        【讨论】:

        • 你的代码可以简化成这样:jQuery(function($) { });
        • 另外,这不是闭包。它只是将一个参数传递给一个函数。
        • @Šime Vidas:我不同意,只要你有一个内部函数,你就有一个闭包。如果 "//..." 所在的代码创建了一个使用 $ 符号的处理程序,那么他将使用通过闭包可用的 $。即使不使用也不代表它不是闭包
        • @Juan 是的,你是对的。它甚至不必是就绪处理程序内部的处理程序,因为就绪处理程序本身(是一个内部函数并且)在外部函数的调用中幸存下来,这会创建闭包。
        猜你喜欢
        • 2011-01-19
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多