Вместо:
this.savedData.forEach(function(assessData) {
this.tempDAMap.set(assessData.qId, assessData.ansSelected);
});
Вам необходимо использовать функции стрелок:
this.savedData.forEach((assessData) => {
this.tempDAMap.set(assessData.qId, assessData.ansSelected);
});
В javascript, function
- это ключевое слово, которое представляет действие, но оно также имеет поведение, аналогичное ключевому слову class
, играющему роль конструктора класса, когда оно появляется после другого ключевого слова: new (например, new function(...) {...}
). Первоначально это даже был способ создания объектов в javascript.
. Из-за этого, когда вы используете ключевое слово function
, вы устанавливаете область действия, а this
внутри нее ссылается на саму функцию как следствие поведения ее конструктора класса.
Этого можно избежать одним из двух способов:
- Старая школа: Сохраните внешнюю область во временной переменной, чтобы ее можно было использовать внутри функции (
that
- это общее имя переменной, используемое для этой задачи):
const that = this;
this.savedData.forEach(function(assessData) {
that.tempDAMap.set(assessData.qId, assessData.ansSelected);
});
Функции стрелок: Чтобы избежать захвата значения
this
внутри функции, вы можете избегать ключевого слова
function
при создании функции. Вместо этого вы можете использовать
обозначение функции стрелки (
лямбда-функции в других языках программирования) для определения ваших функций. Делая это, ключевое слово
this
внутри тела функции стрелки будет ссылаться на внешнюю область видимости (некоторые люди любят говорить, что вы
переводите область видимости в область действия функции ).