Почему функции могут вызываться без скобок при использовании строк шаблона? [дубликат]
На этот вопрос уже есть ответ здесь:
- Backticks вызов функции 1 ответ
У меня есть простая функция регистрации:
function log(str) {
console.log('logged: ', str);
}
Если я вызову его без скобок (в настоящее время с помощью инструментов разработки Chrome) и передам строку шаблона, например:
log`foo`
Вывод: logged: ["foo", raw: Array[1]]
Если я назову его с скобки,
log(`foo`)
Вывод: logged: foo
Почему вызов функции с использованием строки шаблона без скобок работает в Javascript? Что происходит, что заставляет результат отличаться от вызова его с помощью скобок?
1 ответ:
Первый пример (
log`foo`
) позволяет спецификации языка определять значения, передаваемые функции log (см. 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
)