тегированные функции шаблона не являются нормальными функциями, так же как функции конструктора не являются обычными функциями. Они никогда не должны вызываться отдельно от особым способом. Конструкторы, с new
, тегирующими функциями с интерполированным строковым литералом.
У нас есть соглашение, что конструкторы должны быть в Pascal Case, поэтому для вызывающей стороны ясно, что это конструктор.
- Существует ли подобное соглашение для тегирования функций?
- Если нет, то будет ли соблюдение того, что у них есть заключительное подчеркивание, двусмысленным для любого другого соглашения?
function tagger_(s, name, food) {
return `${s[0]}${name}${s[1]}${food}${s[2]}`
}
const name = 'Dave';
const food = 'ice-cream'
const message = tagger_`Hello World! My name is ${name} and I like ${food} for dinner`;
console.log(message);
Аргументом за то, что это не нормальная функция, является то, что первый аргумент не является строкой.
const log = console.log;
function tagger_(s) {
console.log(`Has raw property: ${!!s.raw}`);
}
tagger_(`Hello World!`);
tagger_`Hello World!`
Аналогично, свойство s.raw
содержит строку, не экранированную. Не было бы практического способа подделать это. Даже если бы можно было, это было бы очень плохой практикой.
function tagger_(s) {
console.log(`s.raw: ${s.raw}`);
}
tagger_`This\nhas\tspecial characters`
Проблема с уткой
Несмотря на то, что может быть возможно создать объект типа утки для передачи в метод таким образом, чтобы он не потерпел неудачу немедленно, интерфейс генерируемого engune объекта может расширяться (например, может быть добавлено свойство escapedRaw
) , Это будет означать, что любой вызов метода как нормальной функции прекратится.
Когда мы пишем, что нормальная функция полностью контролирует ее, это не так, потому что тип параметра s
не контролируется автором, если функция.