Как работает пустой оператор возврата в условном операторе? - PullRequest
0 голосов
/ 12 октября 2019

Изучение JS из MDN Docs наткнулось на код в «разделе функций». Не в состоянии понять, что return; в приведенном ниже коде выполняет

function foo(i) {
  if (i < 0)
    return; // what does this do? 
  console.log('begin: ' + i);
  foo(i - 1);
  console.log('end: ' + i);
}
foo(3);

Output

'begin: 3'
'begin: 2'
'begin: 1'
'begin: 0'
'end: 0'
'end: 1' // why are these printing
'end: 2' // this one
'end: 3' // this one

Я понял первые 5 строк вывода, но не смог понять, почему end: 0,1,2,3 идет?

Пожалуйста, помогите!

Ответы [ 4 ]

2 голосов
/ 12 октября 2019

Это должно помочь вам отследить код:

foo(3)
|-- "begin 3"
|-- foo(2)
|   |-- "begin 2"
|   |-- foo(1)
|   |   |-- "begin 1"
|   |   |-- foo(0)
|   |   |   |-- "begin 0"
|   |   |   |-- foo(-1) // returns nothing
|   |   |   |-- "end 0"
|   |   |-- "end 1"
|   |-- "end 2"
|-- "end 3"
2 голосов
/ 12 октября 2019

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);
0 голосов
/ 12 октября 2019

это рекурсивная функция. При заполнении базового условия она выполняет другие операторы. В вашем случае это console.log ('end:' + i);

0 голосов
/ 12 октября 2019

return используется для завершения вызова функции и передачи выполнения обратно родителю

function foo(i) {
if (i < 0)
  return; // prevents further code from being executed, the execution is returned to the parent function from where foo is called
console.log('begin: ' + i);
foo(i - 1);
console.log('end: ' + i);
}
foo(3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...