Строчная интерполяция по переменной
Скажем, у меня есть переменная str
var str = "123"
Теперь я мог бы сделать console.log(`Hello ${str}`)
и распечатать Hello 123
Теперь у меня есть другая переменная strnew
var strnew = 'Hello ${str}'
Примечание (на основе ответов/комментариев) - strnew
считывается из файла, поэтому его всегда строка и не могут быть заменены на `
Как мне console.log(...)
распечатать Hello 123
Возможно ли это с любым типом eval()
Ответы
Ответ 1
С чем-то простым, как ${str}
, вы можете использовать простую замену строк:
var template = (tpl, args) => tpl.replace(/\${(\w+)}/g, (_, v) => args[v]);
var tpl = 'Hello ${str} and ${other}';
console.log(template(tpl, {str: 'foo', other: 'bar'}));
Ответ 2
Вы можете использовать функцию вместо строки.
var strnew = function(str){
return `Hello ${str}`;
}
var str = "123";
console.log(strnew(str))
Ответ 3
Благодаря этому ответу, вот немного кода черной магии, который достигает того, чего вы хотите. Отказ от ответственности - это для удовольствия/очень ограниченного и экзотического применения. Это, вероятно, будет очень медленным и ломается на множестве крайних случаев, но с ограниченным объемом вашего вопроса он работает.
function getString(){
return "calculating ${foo} + ${bar} = ${foo + bar}";
}
var localEnvironmentProxy = new Proxy({}, {
has(target, prop) { return true; },
get(target, prop) { return (prop in target ? target : window)[prop]; }
});
with(localEnvironmentProxy){
var foo = 1;
var bar = 2;
var templString = getString();
var fnFullText = 'with(arguments[0]){ return `' + templString + '`;}';
var tempalteFn = new Function(fnFullText);
console.log(tempalteFn(localEnvironmentProxy));
//calculating 1 + 2 = 3
}