Переоценены ли функции с именами при каждом вызове?

В этом примере:

function foo () {
  function bar () {
    return 'foo bar';
  }
  bar();
}
foo();

Повторяется ли bar для каждого x раз, когда foo вызывается?

И наоборот:

function bar () {
  return 'foo bar';
}
function foo () {
  bar();
}
foo();

Этот тест показывает, что более поздний пример на +/- 1.6x быстрее (в Chrome).

Если не переоценить, почему второй шаблон будет значительно быстрее первого паттерна?

Ответ 1

Короткий ответ: Да.

Как упоминается в комментариях к вашему вопросу, все в теле функции запускается всякий раз, когда вы вызываете функцию.

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