Почему функции могут быть вызваны без скобок при использовании строк шаблона?
У меня есть простая функция регистрации:
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
), вы получите только полученную строку. Нет объектов, нет частей, нет необработанных значений.