Является ли настройка свойств объекта Window считающейся плохой практикой?
Я пишу довольно сложное приложение JavaScript, которое имеет MVC-архитектуру, которую я реализую, используя Prototype Class
и модуль шаблон. Приложение использует AJAX и шаблон Observer. Я создаю свой экземпляр контроллера, когда DOM загрузил, передал ему представление и некоторые модели, созданные из данных JSON, и прочь.
Однако я обнаружил, что должен установить свой экземпляр контроллера как свойство в объекте Window
— i.e. объявите его, не используя var
&mdash, потому что у меня есть обратный вызов AJAX, который обновляет объект представления, принадлежащий контроллеру, и на этом этапе кода мой милый маленький мир MVC не находится в области видимости.
Я исследовал передачу в объекте представления в качестве параметра функции, содержащей код AJAX, но это стало действительно беспорядочным и привело бы к некоторым ужасным нарушениям шаблона MVC, таким как объединение модели и представления. Это было ужасно.
Делает ли что-то вроде хранения экземпляра моего контроллера непосредственно на Window
считается плохой формой? Это немного пахнет, как использование глобальной переменной для меня, но я не вижу никакого способа обойти ее.
Ответы
Ответ 1
Настройка свойств объекта окна эквивалентна созданию глобальных переменных. То есть, иногда выполнение этого неизбежно, но вы должны стараться сохранить его на минимальном уровне, поскольку он в конечном итоге загрязняет глобальное пространство имен.
В вашем случае создание одного свойства не так уж плохо. Если вы хотите быть более осторожным в этом, вы можете явно создать пространство имен для любого материала, к которому вам нужен глобальный доступ:
// In init:
var mynamespace = {};
. . .
// Once the controller is available:
var namespace = window.mynamespace;
namespace.controller = controller;
namespace.foo = bar; // Set other stuff here as well.
Ответ 2
Я бы сказал, что это плохая практика. Вы всегда можете и легко создать пространство имен для своего приложения и разместить там глобальные переменные, если нужно.
Ответ 3
Они полезны, когда вы хотите вызвать глобальную функцию, имя которой неизвестно заранее.
var funcName = "updateAns" + ansNum;
window[funcName]();
Они могут использоваться для
а) избегать злых уклонов в большинстве случаев.
b) избегать ссылок на глобальные переменные.
x = x + 1
генерирует опорную ошибку, если глобальный x не определен.
window.x = window.x + 1
не будет