Строчная интерполяция по переменной

Скажем, у меня есть переменная 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
  
  }