Как исправить ошибку не удается прочитать свойство в цикле foreach

#typescript #ionic-framework #ionic3

#typescript #ionic-framework #ionic3

Вопрос:

У меня есть цикл foreach, в котором я извлекаю данные из firebase. я хочу установить глобальную переменную для хранения «spotrating» (свойство каждого объекта). Но когда я вызываю глобальную переменную внутри цикла forEach, я получаю сообщение об ошибке «не удается установить значение свойства для неопределенного»

когда я пытаюсь зарегистрировать глобальную переменную в любой другой части кода, это работает, но когда я делаю это в цикле forEach, это не работает

 spotrating: any;
  

Позже в моем коде

 temparr.forEach(function(firebaseSpot) {
        console.log(this.spotrating);
 });
  

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

Ответ №1:

Область действия this относится к вашей функции, потому что вы не использовали обозначение жирной стрелки. spotrating не определено в вашей функции. Если вы хотите this обратиться к внешней функции (той, которая ее вызывает), используйте обозначение жирной стрелки, как показано ниже. Определение области действия укусит вас. Я использую жирную стрелку по умолчанию, если не хочу, чтобы область обратного вызова или функции была этим обратным вызовом или функцией. Обычно я этого не делаю.

 temparr.forEach(firebaseSpot => {
        console.log(this.spotrating);
 });
  

Документы

Редактировать: использование функции со стрелкой на самом деле не изменяет область действия функции, как я привык думать, мое использование слова scope выше не совсем корректно. Функция со стрелкой имеет свою собственную область видимости.

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

В функциях со стрелками это сохраняет значение этого лексического контекста. В глобальном коде он будет установлен на глобальный объект

Комментарии:

1. Большое спасибо. Ты спас меня

2. Я рад, что смог помочь … как часто задаваемый вопрос. Если вы используете VSCode (или любую приличную среду IDE), он покажет вам, какие переменные находятся в вашей области видимости. Изучение использования отладки в IDE стоит нескольких часов изучения, это сэкономит вам много времени позже.