问题 函数应该在jQuery的扩展中,还是在外部?


我正在编写我的第一个jQuery插件,我不完全确定应该是什么  扩展声明和什么不应该。

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
};
function someFunc() {/*doSomethin'*/};

要么

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
    function someFunc() {/*doSomethin'*/};
};

11753
2018-05-27 08:48


起源

显然,第一个问题是如果你在一个新项目中使用它,你需要确保你已经定义了 someFunc(),这意味着将它作为一个插件并不会真正实现。一定? - Josh Stevenson
@JoshStevenson我假设整个事情都会放在一个文件中,例如 myplugin.jquery.js 在哪种情况下,这没关系,对吗? - Bram Vanroy
作为旁注,您的插件应返回匹配的元素集以保持jQuery链接 - A. Wolff
@ A.Wolff你能详细说明吗?或者参考我有用的文档?在我还在学习的时候,欢迎所有的教学材料。 - Bram Vanroy
@BramVanroy learn.jquery.com/plugins/basic-plugin-creation/#chaining - A. Wolff


答案:


我会使用第一个选项,因为:

它没有任何负面的副作用。

那就是你错了。如果您正在使用不同的库,则可能会覆盖某些elses someFunc(),可能会破坏他们为您做的任何事情。更安全的方法是在代码周围包装一个闭包。

(function(){

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
};

function someFunc() {/*doSomethin'*/};

/* Do whatever other things you need someFunc/myplugin for */

})();

这样,someFunc就会被全局命名空间屏蔽掉。

或者,您可能要做的是将对象的方法暴露给外部世界。举几个例子:

$.fn.dog = function () {

     this.bark = function() {alert("Woof");};

     return this;
};

var $max = new $('#myDogMax').dog();
$max.bark();

这使函数保持在对象的上下文中,但可以从外部干净地访问它。虽然这通常意味着该方法以某种方式与对象相关。在全局范围内编写一个bark()函数是没有意义的,因为它通常是倾向于执行它而不是浏览器窗口的狗。


9
2018-05-27 09:51





在您的第一种方法中,您最终会污染全局范围添加 someFunc()。第二种方法没有。

但是,这并不意味着第二种方法更好。如果你将第一个方法括在一个闭包中,它基本上就是完全相同的东西,并归结为个人偏好。
在这里,使用第一个方法(在闭包中)甚至可能更好,因此如果在单个JS文件中有多个jQuery扩展,它们可以共享此基本函数。


5
2018-05-27 08:56



如果OP在个人库中使用该函数创建了这个插件,他可以在插件中重新定义它之前检查它是否存在。这样它就可以在插件可以使用全局范围函数时,如果不能在插件中创建它 - SidOfc
@SidneyLiebrand如果函数特定于插件方法,则应在插件内定义,否则在任何外部范围内定义,具体取决于用例 - A. Wolff
你是对的! - SidOfc
只是为了确定,通过 关闭 你的意思是像一个自我调用的功能,对吧? - Bram Vanroy
@BramVanroy完全正确。 - Scimonster