What do (function($) {})(jQuery);意味 着?

2022-08-29 23:57:02

我刚刚开始编写jQuery插件。我写了三个小插件,但我一直只是将这行复制到我所有的插件中,而实际上并不知道它是什么意思。有人可以告诉我更多关于这些的信息吗?也许有一天,在编写框架时,解释会派上用场:)

这是做什么的?(我知道它以某种方式扩展了jQuery,但是关于这一点还有其他有趣的事情要知道吗)

(function($) {

})(jQuery);

以下两种编写插件的方式有什么区别:

类型 1:

(function($) {
    $.fn.jPluginName = {

        },

        $.fn.jPluginName.defaults = {

        }
})(jQuery);

类型 2:

(function($) {
    $.jPluginName = {

        }
})(jQuery);

类型 3:

(function($){

    //Attach this new method to jQuery
    $.fn.extend({ 

        var defaults = {  
        }  

        var options =  $.extend(defaults, options);  

        //This is where you write your plugin's name
        pluginname: function() {

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);

我可能离这里很远,也许所有的意思都是一样的。我很困惑。在某些情况下,这似乎不适用于我使用Type 1编写的插件。到目前为止,Type 3对我来说似乎是最优雅的,但我也想知道其他的。


答案 1

首先,看起来像的代码块只是一个就地执行的函数。让我们稍微分解一下。(function(){})()

1. (
2.    function(){}
3. )
4. ()

第2行是一个普通的函数,用括号括起来告诉运行时将函数返回到父作用域,一旦返回,函数就使用第4行执行,也许通读这些步骤会有所帮助

1. function(){ .. }
2. (1)
3. 2()

您可以看到 1 是声明,2 返回函数,3 只是执行函数。

如何使用它的示例。

(function(doc){

   doc.location = '/';

})(document);//This is passed into the function above

至于关于插件的其他问题:

类型1:这实际上不是一个插件,它是一个作为函数传递的对象,因为插件往往是函数。

类型2:这同样不是一个插件,因为它不扩展对象。这只是jQuery核心的延伸,尽管结果是相同的。这是如果要添加遍历函数(如 toArray 等)的情况。$.fn

类型3:这是添加插件的最佳方法,jQuery的扩展原型会获取一个保存您的插件名称和函数的对象,并将其添加到插件库中。


答案 2

在最基本的级别上,表单的某些内容是立即执行的函数文本。这意味着您已经定义了一个函数,并且您正在立即调用它。(function(){...})()

此表单对于信息隐藏和封装非常有用,因为您在该函数中定义的任何内容仍然是该函数的本地内容,并且无法从外部世界访问(除非您专门公开它 - 通常通过返回的对象文本)。

这种基本形式的变体是您在jQuery插件(或一般的此模块模式)中看到的。因此:

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

这意味着您正在传入对实际对象的引用,但它被称为在函数文本的范围内。jQuery$

类型1并不是一个真正的插件。您只需将对象文本分配给 。通常,您分配一个函数,因为插件通常只是函数。jQuery.fnjQuery.fn

类型2类似于类型1;你并没有真正在这里创建一个插件。您只需向 中添加一个对象文本即可。jQuery.fn

Type 3是一个插件,但它不是创建一个插件的最佳或最简单的方法。

要了解有关此内容的更多信息,请查看此类似的问题答案。此外,此页面还详细介绍了有关创作插件的详细信息。