Некоторое время назад я предложил шаблон дизайна JavaScript (шаблон модуля - см. ниже), который я получил от примера Джона Ресига как часть решения для someones question, и я получил следующий комментарий:
"... эта схема немного выше спроектирован и не очень хорош. Все еще просачиваясь в глобальный охват. и ваш не открывая асинхронные погрузчики. Но лучше тогда просто ad-hoc кодирование!"
Так...
Если "утечка" в глобальную область означает "ваш объект добавляется в окно браузера (объекта)"... то все уже добавляется (глобально):
Это "утечка" в глобальном масштабе:
window.jQuery
... просто звоните: window.jQuery
и он решается как функция();
Это "утечка" в глобальном масштабе:
function HelloWorld() { alert(‘Howdy’); }
... просто звоните: window.HelloWorld()
, и вы получите "Howdy.
Это "утечка" в глобальном масштабе:
var myVariable = 10;
... просто звоните: window.myVariable
, и вы получите 10
Если комментатор верен, то все вышеперечисленные "утечки" в глобальную область. Таким образом, лично я не вижу пути "утечки" в глобальную область видимости, так как существуют даже ваши элементы управления формой (также).
Как таковые, вот мои вопросы...
- Что означает "утечка" в глобальная сфера?
- Почему так плохо?
- Как вы его избегаете?
- При желании создать постоянный пользовательские объекты, почему модуль Образец (ниже) плохой?
- Шаблоны проектирования позволяют инкапсулировать сложной логикой, является инкапсуляция внезапно плохие просто потому, что были писать в 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>
<ч/" > ОБНОВЛЕНО:
Я удовлетворен ответами ниже и хочу поблагодарить всех за то, что они нашли время для комментариев.
ЗАПИСАТЬ ОТВЕТЫ НИЖЕ:
" Утечка" в глобальную область возникает, когда что-то, используемое в локальной области, непреднамеренно предоставляется глобальному охвату (например, оконному объекту). Это плохо, потому что он открывает страницу для потенциальных коллизий имен, что может привести к переходу переменных на неожиданные значения или типы.
Преднамеренное создание переменной global не считается "утечкой". Тем не менее, для уменьшения вероятности упомянутых коллизий именования требуется надлежащее размещение имен объекта.
Вы не можете избежать переменных с глобальным охватом, но вы можете уменьшить вышеуказанные риски, используя асинхронные загрузчики и определяющие модули, доступные в плагинах, например RequireJS или Curl.