Странное поведение при объявлении переменной в функции

Рейтинг: 1Ответов: 1Опубликовано: 17.02.2023

У меня есть некоторый код, вот его упрощенный смысл:

async function func(){
  *1 часть кода*
  data = await other_func() // без let
  *2 часть кода* // эта часть не выполнится
  return true // просто рандомный ответ
}

Так вот, функция работает нормально, возвращает некоторый ответ, но после определения переменной data 2 часть кода не выполняется. Ошибку не выдаёт, всё нормально работает, за исключением того, что 2 часть просто "проглатывается". Как оказалось я забыл объявить переменную через "let", после простановки его перед переменной data, всё начало корректно работать.

async function func(){
  *1 часть кода*
  let data = await other_func() // добавил let
  *2 часть кода* // а теперь эта часть выполнится
  return true // просто рандомный ответ
}

Чем объясняется такое странное поведение? Почему ошибку синтаксиса не выдало, а просто пропустило кусок кода вплоть до return?

Ответы

▲ 0

Асинхронные функции всегда возвращают промис.
Это значит, что асинхронные функции всегда возвращают "положительный" результат с точки зрения проверки на ошибки(try/catch). Однако отследить их мы можем, только лишь дождавшись выполнения самого промиса.

Код ниже не отследит ошибку, т.к. каждая функция будет передавать "промис" дальше по цепочке вызова

async function funcBad() {
  data = '1'// без let
  return true // просто рандомный ответ
}

async function f3() {
  return funcBad()
}

async function f2() {
  try {
    return f3()
  } catch (e) {
    return 'Что то не то'
  }
}

async function f1() {
  return await f2();
}


f1().then(r => console.log(r))

И мы получим сообщение об ошибке

ReferenceError: data is not defined

Если мы будем ждать выполнения каждой функции, то мы перехватим ошибку и сообщения об ошибке не будет:

async function funcBad() {
  data = '1'// без let
  return true; 
}

async function f3() {
  return await func();
}

async function f2() {
  let res;
  try {
    res = await f3();
  } catch (e) {
    res = 'Что то не то';
  }
  return res
}

async function f1() {
  return await f2();
}


f1().then(r => console.log(r))

Ошибка была перехвачена в f2 и вернулось Что то не то

Таким образом, можно сделать "предположение", что какая то функция дожидается выполнения, обрабатывает ошибку и возвращает "положительный" результат.