Литералы шаблонов немного пахнут мне, как eval, и часто цитировали, что использование eval - плохая идея.
Я не заинтересован в производительности шаблонных литералов, но меня беспокоят атаки на инъекции (и другие проблемы безопасности, о которых я, возможно, и не думаю).
Edit
Пример чего-то странного для меня
let ii = 1;
function counter() {
return ii++;
}
console.log(`${counter()}, ${ii++}, ${counter()}`);
Какие выходы
1, 2, 3
Литературный шаблон создает побочные эффекты на глобальном уровне. И функцией, и непосредственно.
Изменить 2
Пример, показывающий безопасность шаблонных литералов
let ii = 1;
let inc = function() { ii++; }
console.log('Starting: ' + ii);
let input = prompt('Input something evil (suggestion: inc() or ii++)');
console.log(`You input: ${input}`);
console.log('After template literal: ' + ii);
eval(input);
console.log('After eval: ' + ii);
Если вы введете ii++
при появлении запроса, он зарегистрирует
Запуск: 1
Вы вводите: ii + = 1
После шаблона литерала: 1
После eval: 2
Изменить 3
Я начал изучать спецификацию ECMAScript
- 18.2.1 - Свойства функции глобального объекта:: Eval (x)
- Обратите внимание на глобальный объект
- Обратите внимание, что в следующем разделе мы расскажем о семантике времени выполнения eval
- 12.2.9 - Первичное выражение:: Литералы шаблонов
- Обратите внимание на выражение
- Обратите внимание, что следующий раздел посвящен "Статическая семантика" шаблонов String
Хотя я не разбираюсь в деталях, кажется, что шаблонные литералы указаны безопаснее, чем eval.