Является ли установка свойств объекта Window плохой практикой? - PullRequest
12 голосов
/ 09 сентября 2010

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 09 сентября 2010

Настройка свойств объекта окна эквивалентна созданию глобальных переменных.То есть иногда это неизбежно, но вы должны попытаться свести его к минимуму, так как это приведет к загрязнению глобального пространства имен.

В вашем случае создание отдельного свойства не так уж плохо.Если вы хотите быть очень осторожным, вы можете явно создать пространство имен для любых вещей, к которым вам нужен глобальный доступ:

// 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 голосов
/ 09 сентября 2010

Они полезны, когда вы хотите вызвать глобальную функцию, имя которой заранее не известно.

var funcName = "updateAns" + ansNum;
window[funcName]();

Они могут быть использованы для а) избегать злых уловок в большинстве случаев. б) избегать ошибок ссылок на глобальные переменные.

x = x + 1 сгенерирует ошибку ссылки, если глобальный x не определен. window.x = window.x + 1 не будет

2 голосов
/ 09 сентября 2010

Я бы сказал, что это плохая практика. Вы всегда можете легко и просто создать пространство имен для своего приложения и поместить глобальные переменные туда, если необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...