Подтвердить что ты не робот

Является ли настройка свойств объекта Window считающейся плохой практикой?

Я пишу довольно сложное приложение JavaScript, которое имеет MVC-архитектуру, которую я реализую, используя Prototype Class и модуль шаблон. Приложение использует AJAX и шаблон Observer. Я создаю свой экземпляр контроллера, когда DOM загрузил, передал ему представление и некоторые модели, созданные из данных JSON, и прочь.

Однако я обнаружил, что должен установить свой экземпляр контроллера как свойство в объекте Window — i.e. объявите его, не используя var &mdash, потому что у меня есть обратный вызов AJAX, который обновляет объект представления, принадлежащий контроллеру, и на этом этапе кода мой милый маленький мир MVC не находится в области видимости.

Я исследовал передачу в объекте представления в качестве параметра функции, содержащей код AJAX, но это стало действительно беспорядочным и привело бы к некоторым ужасным нарушениям шаблона MVC, таким как объединение модели и представления. Это было ужасно.

Делает ли что-то вроде хранения экземпляра моего контроллера непосредственно на Window считается плохой формой? Это немного пахнет, как использование глобальной переменной для меня, но я не вижу никакого способа обойти ее.

4b9b3361

Ответ 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 не будет