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

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

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

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

log`foo`

Результат: logged: ["foo", raw: Array[1]]

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

log(`foo`)

Результат: logged: foo

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


person Sebastian Sandqvist    schedule 11.11.2015    source источник


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

person Sampson    schedule 11.11.2015
comment
Стоит добавить ссылку, так как я раньше об этом не слышал: developers.google.com/web/updates/2015/01/ - person Mathletics; 12.11.2015
comment
Я наткнулся на это, увидев, что он используется в коде коллеги, который просматривал. Крутая вещь. Спасибо за объяснение. - person Dave Sag; 25.05.2018