jQuery插件定义
关于“标准”jQuery插件定义,我似乎无法理解,而且似乎没有任何插件教程对此进行解释。jQuery插件定义,jquery,jquery-plugins,Jquery,Jquery Plugins,关于“标准”jQuery插件定义,我似乎无法理解,而且似乎没有任何插件教程对此进行解释。 我见过的大多数插件定义如下: (function($) { $.extend($.fn, { pluginName: function( options ) ... }); })(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