Некоторое время назад я предложил шаблон проектирования JavaScript (Шаблон модуля - см. Ниже), полученный из примера Джона Резига, как часть решения чьего-то вопроса и я получил следующий комментарий:
«… этот паттерн чуть более
спроектирован и не так хорош. Еще
утечка в глобальном масштабе. и ваш
не открывать себя асинхронным загрузчикам.
Но это лучше, чем просто ad-hoc
кодирование! »
Итак ...
Если «утечка» в глобальную область означает «ваш объект добавляется в окно браузера (объект)»… тогда все уже добавляется (глобально):
Это «просачивается» в глобальную область видимости:
window.jQuery
… просто вызовите: window.jQuery
и он разрешается как функция ();
Это «просачивается» в глобальную область видимости:
function HelloWorld() { alert(‘Howdy’); }
... просто позвоните: window.HelloWorld()
и вы получите "Привет".
Это «просачивается» в глобальную область видимости:
var myVariable = 10;
… просто позвоните: window.myVariable
и вы получите 10
Если комментатор верен, то все вышеперечисленное «просачивается» в глобальную область видимости. Так что лично я не вижу способа НЕ «просочиться» в глобальную область видимости, поскольку там даже существуют ваши элементы управления формой.
Как таковые, вот мои вопросы ...
- Что подразумевается под «утечкой» в
глобальная сфера?
- Почему это плохо?
- Как вам этого избежать?
- При желании создать постоянный
custom-объекты, почему модуль
Узор (внизу) плохой?
- Шаблоны проектирования позволяют вам инкапсулировать
сложная логика, это инкапсуляция
вдруг плохо просто потому, что мы
писать на JavaScript ?
- Или ... этот комментатор просто не прав?
Вот шаблон модуля, о котором я упоминал выше:
<script type="text/javascript">
var myNamespace = (function($) {
var publicInstances = {};
// ***********************
// myObject
publicInstances.myObject = myObject;
function myObject() {
/// <summary>A pointer to this</summary>
var self = this;
this.someProperty = new String();
this.initialize = function() {
/// your code here
}
this.someMethod = function() {
/// your code here
}
self.initialize();
}
return publicInstances;
})(jQuery);
jQuery(document).ready(function() {
// Use would look like
var myInstance = new myNamespace.myObject();
});
</script>
<ч />
ОБНОВЛЕНО :
Я удовлетворен приведенными ниже ответами и хочу поблагодарить всех, кто нашел время для комментариев.
ЗАПИСАТЬ ОТВЕТЫ НИЖЕ:
«Утечка» в глобальную область происходит, когда что-то используемое в локальной области непреднамеренно становится доступным для глобальной области (например, объекта окна). Это плохо, потому что открывает страницу для потенциальных конфликтов имен, которые могут привести к тому, что переменные преобразуются в неожиданные значения или типы.
Умышленное создание глобальной переменной не считается «утечкой». Тем не менее, правильное пространство имен объекта необходимо для уменьшения вероятности упомянутых конфликтов имен.
Вы не можете избежать глобально изменяемых переменных, но вы можете уменьшить вышеуказанные риски, используя асинхронные загрузчики и определяющие модули, доступные в плагинах, таких как RequireJS или Curl .