19

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

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

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

log`foo` 

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

Если я называю это с помощью скобок,

log(`foo`) 

Выходной сигнал: logged: foo

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

ответ

21

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

+1

Стоит добавить ссылку, о которой я раньше не слышал: https://developers.google.com/web/updates/2015/01/ES6-Template-Strings#tagged-templates – Mathletics

+0

Я столкнулся с этим после видя, что он используется в коде сотрудника, который я просматривал. Классная вещь. Спасибо за объяснение. –