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

Should functions be inside jQuery's extend, or outside?

我正在编写我的第一个 jQuery 插件,但我不完全确定扩展声明 中应该包含哪些内容,不应该包含哪些内容。

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

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

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

但是,这并不意味着第二种方法更好。如果您将第一个方法包含在一个闭包中,它基本上最终会成为完全相同的东西,并且归结为个人喜好。
在这里,使用第一种方法(在闭包中)可能会更好,这样如果你在一个 JS 文件中有多个 jQuery 扩展,它们可以共享这个基函数。

I'd use the first option because:

It doesn't have any negative side effects.

那就是你错了。如果您正在使用不同的库,您可能会冒着覆盖其他人的 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() 函数没有什么意义,因为通常是狗而不是浏览器会这样做 windows.