#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:
Я попытаюсь показать «порядок операций»
- Вызов
init()
init()
будетconsole.log
, ноvalidate()
для этого нужен результатvalidate()
называетсяvalidate()
выходыho
с использованиемconsole.log
validate()
возвращаетсяhi
вinit
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 для получения более подробной информации.
Надеюсь, это было полезно.