Ответ 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
)