return
завершает функцию current и возвращает поток управления вызывающей стороне.
Когда вызывается foo(3);
, функция инициализируется параметром i
, равным 3. Он не выполняет оператор if
, печатает begin: 3
, а затем вызывает foo(3 - 1);
. В этот момент текущая функция (функция с параметром i
, равным 3) приостанавливается до завершения вызова foo(3 - 1);
.
foo(2);
печатает begin: 2
, а затем приостанавливается при вызове foo(1)
.
foo(1)
печатает begin: 1
, а затем делает паузу при вызове foo(0)
.
foo(0)
печатает begin: 0
и возвращает: завершается и возвращает поток управления обратновызывающей стороне вызов функции foo(1)
.
foo(1)
возобновляется и продолжает выполняться, печатая end: 1
. Это конец функционального блока, поэтому вызов функции foo(1)
завершается, возвращая поток управления обратно к вызову функции foo(2)
.
foo(2)
возобновляется, печатается end: 2
, затем завершается, давая управлениевернуться к foo(3)
. Затем foo(3)
печатает end: 3
и завершает работу.
return
завершает только текущую функцию. Единственный способ завершить все вызывающие функции (пока не встретится catch
) - это выдать ошибку:
function foo(i) {
if (i < 0)
throw new Error();
console.log('begin: ' + i);
foo(i - 1);
console.log('end: ' + i);
}
foo(3);