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

Bra*_*roy 11 javascript jquery function jquery-plugins

我写我的第一个jQuery插件,我不完全知道应该是什么样的内部扩展声明,哪些不应该.

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
};
function someFunc() {/*doSomethin'*/};
Run Code Online (Sandbox Code Playgroud)

要么

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
    function someFunc() {/*doSomethin'*/};
};
Run Code Online (Sandbox Code Playgroud)

Hyd*_*e87 9

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

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

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

(function(){

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

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

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

})();
Run Code Online (Sandbox Code Playgroud)

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

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

$.fn.dog = function () {

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

     return this;
};

var $max = new $('#myDogMax').dog();
$max.bark();
Run Code Online (Sandbox Code Playgroud)

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


Sci*_*ter 5

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

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