javascript одновременный вызов нескольких функций - PullRequest
0 голосов
/ 05 августа 2020
a = function(x) {
    return new Date().getTime();
}

b = function(x) {
    return new Date().getTime();
}

c = function(x,y) {
    return x+' '+y
}

console.log(c(a(),b()));

В приведенном выше коде функции a и b вызываются одновременно функцией c. Выполняется ли сначала функция a, а затем функция b, или обе функции выполняются одновременно? Трудно сказать, поскольку возвращенные отметки времени совпадают.

Ответы [ 2 ]

4 голосов
/ 05 августа 2020

c(a(),b()) - это выражение вызова функции.

Выражения вызова состоят из следующих частей:

  • выражение функции, которое идентифицирует функцию, которая должна быть вызвана.
  • открывающая скобка.
  • разделенный запятыми список из нуля или более выражений аргументов.
  • закрывающая скобка.

Когда вычисляется выражение вызова функции, функция сначала оценивается выражение, а затем выражения аргументов, если таковые имеются, оцениваются (слева направо) для получения значений, которые должны быть переданы вызываемой функции.

c(a(),b()) оценивается как:

  1. Прежде всего, вычисляется идентификатор c. Если c не было определено, javascript выдал бы ReferenceError.

  2. Поскольку в этом случае c является функцией, поэтому выражения аргументов вычисляются из слева направо.

  3. Сначала вычисляется a(), которое само по себе является выражением вызова. Итак, a вычисляется первым, и поскольку аргументов нет, вызывается функция a и выполняется тело функции a. Поскольку a возвращает new Date().getTime(), оно становится значением a() выражения вызова.

  4. После этого b() вычисляется так же, как вычисляется a().

  5. Наконец, вызывается c() с возвращаемыми значениями a() и b() в качестве аргументов. Если бы c не было функцией, javascript выдал бы TypeError.

2 голосов
/ 05 августа 2020

Javascript всегда выполняется в одном потоке, поэтому они вызываются один за другим.

Причина, по которой метка времени одинакова, заключается в том, что часы вашего компьютера (или клиентского компьютера) имеют только конкретное c разрешение. Я имею в виду что-то от 16ms, что определенно больше, чем вызов двух функций.

В любом случае я не совсем уверен, какая функция вызывается первой, я бы предположил a, а затем b , но это может зависеть от интерпретатора Javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...