Да, (
в a1()
означает, что это нужно назвать.И самое первое, что он делает - это оценивает передаваемый параметр. В этом случае передается вызов функции, то есть функция со своим собственным набором ()
.
Это означает, чтоa1
нужно дождаться оценки a2
, чтобы он мог передать возвращаемое значение из вызова a2
в a1
в качестве параметра.То же самое касается a2
принятия a3
в качестве параметра.
В следующем коде псевдо вы можете увидеть:
function a1(number) {
return number;
}
Если вы называете это так:
a1(2+3) // you can't just run a1(2)
Сначала вы должны оценить 2+3
, а для вычисления функции, вызываемой в круглых скобках, вы должны запустить всю функцию.В вашем случае эта функция записывает что-то на консоль.
Редактировать: добавив это ниже, потому что это было в комментариях и ответ, который искал OP.
Первый вызов функции фактически начинаетсяновый контекст выполнения, и эта функция переходит на вершину «стека вызовов», но первое, что делает функция, это оценивает аргумент.Если этот аргумент является функцией, он запускает свой собственный контекст выполнения и перемещается в верхнюю часть «стека вызовов» и так далее.А так как стеки работают по принципу «первым пришел - первым вышел», самый последний из них должен оцениваться первым.