Почему функции могут вызываться без скобок при использовании строк шаблона? [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть простая функция регистрации:

function log(str) {
  console.log('logged: ', str);
}

Если я вызову его без скобок (в настоящее время с помощью инструментов разработки Chrome) и передам строку шаблона, например:

log`foo`

Вывод: logged: ["foo", raw: Array[1]]

Если я назову его с скобки,

log(`foo`)

Вывод: logged: foo

Почему вызов функции с использованием строки шаблона без скобок работает в Javascript? Что происходит, что заставляет результат отличаться от вызова его с помощью скобок?

1 20

1 ответ:

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

Шаблонные литералы могут содержать строки, а также выражения. Иногда вы можете иметь больше контроля над компиляцией строки из ее частей-строк и частей-выражений. В этом случае вы можете искать шаблоны с тегами.

var name = "Jonathan";
var mssg = foo `Hello, ${name}. Nice name, ${name}.`;

function foo ( strings, ...values ) {
    console.log( strings ); //["Hello, ", ". Nice name, ", ".", raw: Array[3]]
    console.log( values  ); //["Jonathan", "Jonathan"]
}

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

С этим дополнительным контролем мы могли бы делать все виды вещей, таких как локализация. В этом примере спецификация языка определяет соответствующие значения для передачи функции-разработчик этого не определяет.

Для контраста, когда вы звоните log(foo), вы заканчиваете тем, что получаете только результирующая строка. Ни предметов, ни деталей, ни необработанных ценностей.