В этой функции почему сначала печатается «ho» вместо «привет»

#javascript #node.js

Вопрос:

 function init() {
    console.log("hello "   validate());
}
function validate() {
    console.log("ho ");
    return 'hi'
}
init() 

Вывод этого кода является:

 ho
hello hi
 

Я не могу понять смысла приказа. Чего мне не хватает?

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

1. validate Функция выведет его console.log , прежде чем вернуть его значение в init console

2. Просто чтобы немного подробнее остановиться на ответе 0stone0s: когда init() он выполняется, его console.log() оператор обрабатывается. В этом процессе validate() , конечно, выполняется. Это приводит к тому, что сначала console.log() ho то, а затем hello hi .

3. init() был вызван на погрузку. init вызван validate из консоли.журнал. validate распечатан ho и возвращен hi . Который был напечатан init вместе с hello вместе как hello hi

Ответ №1:

Я попытаюсь показать «порядок операций»

  1. Вызов init()
  2. init() будет console.log , но validate() для этого нужен результат
  3. validate() называется
  4. validate() выходы ho с использованием console.log
  5. validate() возвращается hi в init
  6. init() теперь будет console.log полная строка
 ho             <-- Result of validate() being called to get value in init
hello hi       <-- Result of init()` console.log
 

Ответ №2:

Чтобы создать строку для вывода init() , validate() сначала вызывается функция. Он завершает свою логику (включая вывод «ho»), пока не попадет в оператор return. После того, как он возвращает «привет», строки объединяются, чтобы получить «привет, привет», и только тогда они выводятся на консоль.

Ответ №3:

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

 01 | function init() {
02 |     console.log("hello "   validate());
03 | }
04 | function validate() {
05 |     console.log("ho ");
06 |     return 'hi'
07 | }
08 | init()
 

Вот как выполняется ваш код. Точка входа находится в строке 8, потому что все остальные строки до этого являются частью объявлений функций. Так init() это называется. что заставляет компьютер выполнять функцию в строке 1.

там вы спрашиваете console.log строку hello и то, что возвращается из функции validate() .

теперь компьютер начинает выполнять validate() функцию, потому что для выполнения запрошенного console.log вами в строке 2 требуется возврат validate() . Внутри validate() функции вы говорите «спросите console.log строку ho «. Поэтому ho печатается. Затем в строке 6 вы возвращаете строку hi .

здорово. теперь у вас есть все необходимое, чтобы завершить выполнение строки 2. Таким образом "hello " , он объединяет и "hi" (который был возвращен из validate() функции. в результате получается "hello hi" . Затем компьютер распечатывает его. Но помните, что вы уже напечатали слово "ho " в строке 5. Поэтому после выполнения строки 2 терминал должен отобразить "ho hello hi"

Ответ №4:

Исполнение выглядит следующим образом

  • init был вызван на погрузку.
  • init звонил validate из console.log .
  • validate распечатал ho и вернул hi .
  • Это возвращаемое значение было принято в init методе, который был напечатан init вместе с hello вместе как hello hi
  • Таким образом, первое печатаемое значение будет ho из validate функции там после hello hi из init функции.

Ответ №5:

Движок поддерживает механизм стека вызовов для управления контекстами выполнения различных функций. Стек вызовов следует порядку обработки «Последний вход-первый выход». Функция init() помещается в стек вызовов при первом вызове. Затем встречается функция validate (), и она помещается в стек.

На этом этапе стек вызовов будет выглядеть так:

  • утверждать
  • в этом

Во время выполнения вызовов последняя запись, т. е. функция validate() извлекается из стека и сначала печатает «ho».

Затем выполняется функция init (), которая выводит «привет, привет».

Проверьте ссылку https://developer.mozilla.org/en-US/docs/Glossary/Call_stack для получения более подробной информации.

Надеюсь, это было полезно.