Ответ 1
Это не имеет смысла. Строка шаблона не имеет доступа ни к чему, она также не выполняется. Строка шаблона является синтаксическим элементом языка.
Динамическое построение строки шаблона без проблем - это похоже на создание выражения (в любом формате, будь то строка кода или AST). Проблема MDN заключается в оценке такого выражения (например, с использованием eval
, сериализации его в script, который подается пользователю и т.д.) - он может содержать произвольный код, в отличие от строкового литерала! Но, конечно же, вы бы этого не сделали, не так ли?
Это предупреждение похоже на то, что "Конкатенации с использованием оператора +
не должны создаваться ненадежными пользователями, поскольку они имеют доступ к переменным и функциям". и приведя для него пример "" + console.warn("this is",this) + ""
. Ну, это верно для любого выражения языка, поэтому это не особенно интересно.
В то время как мы говорим о дрянной кодировке, есть, конечно, сценарий, в котором использование строк шаблонов (эй, они многострочные и еще ничего) вместо строковых литералов может привести к проблемам:
function escapeString(str) {
return JSON.stringify(str).slice(1, -1)
.replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
}
// This is (kinda) fine!
var statement = 'var x = "Hello,\\n'+escapeString(userInput)+'";';
eval(statement); // some kind of evaluation
// But this is not:
var statement = 'var x = `Hello,\n'+escapeString(userInput)+'`;';
// ^ ^
Теперь представьте, что userInput
содержит ${…}
- который мы не убежали...