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

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

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

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

log`foo`

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

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

log(`foo`)

Выход: logged: foo

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

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), вы получите только полученную строку. Нет объектов, нет частей, нет необработанных значений.

Другие вопросы по тегам