jQuery插件定义

jQuery插件定义,jquery,jquery-plugins,Jquery,Jquery Plugins,关于“标准”jQuery插件定义,我似乎无法理解,而且似乎没有任何插件教程对此进行解释。 我见过的大多数插件定义如下: (function($) { $.extend($.fn, { pluginName: function( options ) ... }); })(jQuery); 现在,虽然我理解了函数($){…}部分的功能(确保jquery即使在无冲突模式下也能与$一起工作,创建一个“私有”方法等),但我不明白为什么第一个字符是(

关于“标准”jQuery插件定义,我似乎无法理解,而且似乎没有任何插件教程对此进行解释。
我见过的大多数插件定义如下:

(function($) {
    $.extend($.fn, {
        pluginName: function( options )
            ...
    });
})(jQuery);
现在,虽然我理解了
函数($){…}
部分的功能(确保jquery即使在无冲突模式下也能与
$
一起工作,创建一个“私有”方法等),但我不明白为什么第一个字符是
,它以
)结尾(jquery)

是否需要使插件可链接?可以安全地忽略它吗

编辑

同一定义的变化:

;(function($) { // why is ; there?

构造(..)(jQuery)是用于在命名空间“jQuery”中“插入”的闭包。

它只是定义一个匿名函数并立即调用它,您可以这样想:

var f = function($) { /* Code goes here, can use $ */ };
f(jQuery); // assings jQuery to $ parameter
$.pluginName = {
    init: function(){
        var myPlugin = $.pluginName;

        // Attach jQuery Object Prototype (fn function)
        $.fn.pluginName = myPlugin.fn;

        // Attach DomReady
        $(function(){
            myPlugin.domReady();
        });
    }
    domReady: function(){},
    fn: function(){
        // your jQuery object function
    }
});

// Initialise our Plugin
$.pluginName.init();
现在,如果您将这两条语句合并为一条,您将得到:

(function($) { /* Code goes here */ })(jQuery);

这就是它真正的作用。以这种方式使用匿名函数不会用无用的变量名污染全局作用域,并允许您在无冲突模式下使用
$
符号。

包装行用于创建匿名函数,然后调用它。jQuery被传递,然后别名为$,这样您的插件仍然可以在jQuery noConflict模式下工作($将不被定义)。匿名函数是一个局部作用域,这样我们就不会意外地定义任何全局变量,因为它们是坏的

还有一点,作为jQuery插件开发人员,我并不建议使用该代码开发插件: $.extend($.fn{ pluginName:函数(选项) ... });

所有这些只需向jQuery对象原型添加一系列函数,例如,您可以调用$('#el').pluginName()。如果你的插件非常简单,这是很好的,但是它会变得很难维护,因为你的插件仍然是以过程的方式定义的,而不是面向对象的

更好的方法是这样的:

var f = function($) { /* Code goes here, can use $ */ };
f(jQuery); // assings jQuery to $ parameter
$.pluginName = {
    init: function(){
        var myPlugin = $.pluginName;

        // Attach jQuery Object Prototype (fn function)
        $.fn.pluginName = myPlugin.fn;

        // Attach DomReady
        $(function(){
            myPlugin.domReady();
        });
    }
    domReady: function(){},
    fn: function(){
        // your jQuery object function
    }
});

// Initialise our Plugin
$.pluginName.init();
如果你的插件在某些方面有缺陷,这种方法还允许人们轻松地扩展插件,或者自己修复代码,而不必触碰你的插件。例如,我可以通过以下操作覆盖您的fn函数: $.pluginName.fn=fixedFnFunction()

这对社区发展很有帮助。我也喜欢它,因为它将jQuery对象原型中的内容保持在最低限度,从而减少了开销


我正在寻找关于此的参考文章,准备好后将发布。

这里有一个提示:模式
(function(params){…})(args)
定义了一个匿名函数,然后调用它。关于前面的分号:非常有用的信息,尽管这不是我在这里要问的,+1