Подтвердить что ты не робот

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

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

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

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

log`foo`

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

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

log(`foo`)

Выход: logged: foo

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

4b9b3361

Ответ 1

В первом примере (log`foo`) спецификация языка определяет значения, переданные функции журнала (см. 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), вы завершаете получение только итоговой строки. Нет объектов, без частей, без исходных значений.