Должны ли функции внутри jQuery распространяться или снаружи?

Я пишу свой первый плагин jQuery, и я не совсем уверен, что должно быть внутри объявления расширения, а что нет.

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

ИЛИ

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

Ответ 1

Я бы использовал первый вариант, потому что:

У него нет никаких отрицательных побочных эффектов.

Что вы ошибаетесь. Если вы работаете с разными библиотеками, вы рискуете переписать кого-то 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() глобально, так как обычно это собаки, которые обычно делают это, а не окна браузера.

Ответ 2

В вашем первом методе вы в конечном итоге загрязняете глобальную область добавления someFunc(). Второй метод не работает.

Однако это не означает, что второй метод лучше. Если вы приложите первый метод к закрытию, он в конечном итоге становится тем же самым и подходит к личным предпочтениям.
Здесь может быть даже лучше использовать первый метод (в закрытии), так что, если у вас есть несколько расширений jQuery в одном JS файле, они могут использовать эту базовую функцию.