Почему return не останавливает выполнение кода?

Мне не понятно почему после директивы return код продолжает выполняться. То есть при нажатии кнопки, функция запускается, в ней переменная увеличивается на 1, увеличение прекращается, когда a становится больше 5, идет выход из функции. Однако, на этом все не заканчивается, после return почему-то срабатывает console.log.

let a = 1;
const button = document.querySelector('button');

function func() {
  a++; 
  //console.log(a); //2, 3, 4, 5, 6
  if (a > 5) return 5; //прекратилось на 6
  func();
  console.log(a);
}
button.onclick = func;
<button>Button</button>

Также почему-то эта функция не делает возврат значения.

let a = 1;
const button = document.querySelector('button');

function func() {
  a++; 
  //console.log(a); //2, 3, 4, 5, 6
  if (a > 5) return 5; //прекратилось на 6
  func();
  console.log(a);
}
button.onclick = func;
console.log(func() + 1); //5 + 1 = 6 -- не выводится
<button>Button</button>

P. S. Хотя нет, return все-таки прерывает функцию, иначе было бы переполнение стека. Получается, что все эти 6-ки это выход из функции?


Ответы (1 шт):

Автор решения: Aziz Umarov

Все просто у вас рекурсия. И console.log вызывается у родительского вызова.

Протрасируйте по шагам вы увидите что после return функция выйдет из func() внутреннего и выполнит инструкцию далее.

let a = 1;
const button = document.querySelector('button');

function func() {
  a++; 
  //console.log(a); //2, 3, 4, 5, 6
  if (a > 5) return 5; //прекратилось на 6
  console.log('вызов до ' + a)
  func();
  console.log('вызов после ' +a);
}
button.onclick = func;
console.log(func() + 1); //5 + 1 = 6 -- не выводится
<button>Button</button>

А я так понимаю что вы хотели бы так. Только вы забыли про return.

let a = 1;
const button = document.querySelector('button');

function func() {
  a++; 
  //console.log(a); //2, 3, 4, 5, 6
  if (a > 5) return 5; //прекратилось на 6
  
  return func();
  
}
button.onclick = func;
console.log(func() + 1); //5 + 1 = 6 -- не выводится
<button>Button</button>

→ Ссылка