В чем преимущество сохранения значения в объекте окна в Angular? - PullRequest
0 голосов
/ 19 декабря 2018

Я просматривал этот код , а на эту строку Я видел

(окно) .user = user;

Мне интересно, какова важность установки пользовательского объекта в качестве значения в объекте окна?Я понимаю, что это может быть для более легкого доступа в будущем, но пользовательский объект также сохраняется в наблюдаемой, и метод get user () извлекает его из наблюдаемой:

getUser(): Observable<any> {
    return this.$userSource.asObservable();
}

Также из thisответ Я понимаю, что:

В JavaScript любая глобальная переменная на самом деле является свойством объекта окна.Использование одного эквивалентно (и взаимозаменяемо) использованию другого.

Итак, мои вопросы:

  1. Какова важность установки пользовательского объекта в качестве значения вобъект окна?
  2. Будет ли код работать нормально, если мы избавимся от строки, хранящей код в объекте окна?
  3. Являются ли глобальные переменные в классах машинописи такими же, как свойствообъект окна?Например: это значение также является свойством объекта окна?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Существует несколько проблем с использованием переменных в глобальном.

  1. window является глобальным.

Вот пример, почему это опасно.

window.item = {
    name: 'Something great'
};
function selectItem() { //wrong line
    item.name = 'selected';
}
selectItem(event.target);

Как видите, разработчик забыл добавить аргумент item для функции selectItem.Ожидается, что изменится название выбранного элемента, но глобальный элемент будет изменен.

this = window, this равно window, если вы не используете строгий режим .

Давайте рассмотрим тот же пример, но на этот раз мы будем использовать контекст.

function selectItem() {
     this.name = 'selected'
}
const item = {
     name: 'An item'
}
selectItem.call(item); //Assume that item is somehow undefined or null.

Снова тот же результат, window.name будет изменено.

global для global, инкапсулируйте его.

Я могу легко получить доступ к window и его переменным.Я также могу определить ту же переменную, что и вы.Или я могу получить доступ к вашим переменным, и это будет проблемой безопасности.

Тестирование

Вы не можете легко протестировать то, что имеет переменную в глобальном.Потому что он не инкапсулирован в вашу сферу.

В глобальном масштабе сборщик мусора отсутствует.Я предполагаю, что опасность достаточно ясна.

Чтобы ответить на ваши вопросы:

  1. Читать выше
  2. Читать выше
  3. Эта строка имеетпубличная собственность.Это не глобально.Это не определено в окне.Это будет свойство экземпляра.
0 голосов
/ 19 декабря 2018

window объект является глобальным.

Это означает, что если вы напишите

window.user = null

Вы стерли предыдущее значение, установленное библиотекой.

Обычно считается плохой практикой хранить переменные в объекте окна.

Чтобы ответить вам:

  1. Не важно, даже не рекомендуется
  2. Вам придется проверить библиотеку для этого
  3. Нет, онинет: нет «глобальной переменной класса».Это либо глобальная переменная, либо член класса.Но глобальные переменные могут быть сделаны и в Typescript.
...