Почему функция выполняется сначала в console.log? - PullRequest
2 голосов
/ 03 октября 2019

Посмотрите на этот фрагмент:

let first = 1;

function second() {
  console.log(2);
}

console.log(first, second()); // 2 1

Я ожидаю, что он напечатает 1 2 в порядке вместо 2 1. Почему функция second выполняется первой? Я наблюдаю, если оба аргумента console.log являются функциями, порядок их передачи сохраняется (см. Пример ниже)

function first() {
  console.log(1);
}

function second() {
  console.log(2);
}

console.log(first(), second()); // 1 2

Пожалуйста, объясните это поведение соответствующими ресурсами.

Ответы [ 2 ]

4 голосов
/ 03 октября 2019

Все аргументы в списке аргументов оцениваются до , вызывается функция, содержащая список аргументов. Так что

someFn(first(), second());

будет всегда вызывать first, затем вызывать second (вместе с любыми другими аргументами), пока не будут получены промежуточные значения, такие как

someFn(firstResultExpression, secondResultExpression);

, в этот момент someFn будет вызываться с этими (теперь разрешенными) выражениями.

В этом случае someFn оказывается console.log. Так что, если first() и second() что-либо регистрируют сами, эти журналы всегда будут появляться первыми, прежде чем последний someFn начнет что-либо делать.

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

Сообщение немного вводит в заблуждение, потому что комментарий предполагает вывод 2 1.

console.log(first, second()); // 2 1

Но на самом деле это вывод:

2
1 undefined

Мы получаем 2выводите сначала, потому что console.log(first, second()) вызывает second() и это выводит 2 в console.log.

Обратите внимание, что функция second() ничего не возвращает. Если возвращаемое значение опущеноиз функции возвращается undefined .

Затем console.log(first, undefined) оценивается и мы получаем вывод

1 undefined

Обратите внимание, что если second () вернул значение (скажем, например, 3):

let first = 1;
function second() {
   console.log(2);
   return 3;
} 
console.log(first, second());

, тогда вывод будет

2
1 3
...