jQuery $(function(){})vs(function(){})($)

时间:2017-01-23 15:17:21

标签: javascript jquery

我了解以下是$( document ).ready()的简写:

$(function() {
    console.log( "ready!" );
});

我也理解匿名JS函数是什么,但jQuery在使用one函数调用时会做什么特别的事情。即:

(function() {
    console.log( "ready!" );
})($);

后者只是一个使用jQuery的普通匿名JS函数(即它不会被视为$(document).ready()的简写,因此会立即执行)?

我觉得以前必须要问过,但是如果有的话,我找不到它。

3 个答案:

答案 0 :(得分:9)

正如你所提到的,前者确实是if (req.body.user) {do something...} 的简写。 至于后者,这只是一个立即调用函数表达式

$(document).ready()

这个函数只是一个匿名函数,它接收一个名为(function ($) { console.log('ready'); })(jQuery); 的参数。该函数是立即调用,并带有一些值(在本例中为$)作为参数。

IIFE还可用于隔离范围以及避免包含多个JavaScript文件的Web应用程序中的全局变量。在这种情况下,可以使用无参数IIFE:

jQuery

有关立即调用函数表达式的详细信息,请参阅此问题:What is the purpose of a self executing function in javascript?

答案 1 :(得分:7)

第一个确实是$( document ).ready()的简写,如here所示。

但第二个是立即调用函数表达式(IIFE),这是一个声明并立即调用的匿名函数。

事实上,正确的语法示例中缺少的参数)是:

(function($) {
    //my $ object is local now
})(jQuery);

在这种情况下,您使用参数调用匿名函数。

此模式(IIFE)的主要优点是:隔离您的代码(您可以根据需要创建任意数量的变量,它将仅限于您的匿名函数范围,除非你归还某些东西)。此模式用于定义“private”“public”方法。像这样:

var myModule = (function() {

    function privateFunction() { console.log("I can't be accessed from outside :("; }

    var privateVar = "me too :(";

    function publicFunction() { console.log("Hey! I'm here!"; }

    /* expose what you want */
    return {
        publicFunction: publicFunction
    }

})();

myModule.publicFunction(); //Hey! I'm here!
myModule.privateFunction(); //undefined;

您也可以将其称为模块模式

在第二个示例中,您使用参数调用最近创建的匿名函数,并且您的匿名函数接收该参数。这是依赖注入的一种方式。

这样,您可以将函数内的全局变量作为本地操作。请注意,在第一个示例中,我们传递了一个jQuery对象,并在函数内将其作为$进行操作。有人覆盖jQuery对象比较困难,但是,某些脚本可以重新分配全局美元符号,特别是如果您没有完全控制您的应用程序。这样,你总是传递te jQuery对象并将其操作为$

最后,让我列出将参数传递给从here抓取的IIFE的其他一些优点:

  • 它更快:JavaScript首先查找本地范围(之前 爬上去)。它可能会提高性能。

  • 帮助缩小:minifier现在可以重命名你的变量 范围为一个字母的单词,减少代码大小。

答案 2 :(得分:3)

  

后者只是一个使用jQuery的普通匿名JS函数(即不是$(document).ready()的简写,因此会立即执行)?

是的,确切地说,它只是一个普通的IIFE,它将$个全局变量作为参数

(function(dollarSignArgument) {
    console.log( "not really ready!" );
})($)

它会立即执行