在javascript中,假定一些类似于以下数据的定义:
y='${z}'
z='hi' // y and z can be constants, or read from file, or ...
x=`===${y}===`
是否可以编写一个以“ x”等于“ === hi ===“而不是“ === $ {z} ===””结尾的“简单” javascript代码?
(注意,找到目标结果的步骤是“ === $ {y} ===” =>“ === $ {z} ===” =>“ === hi ===” )。
也就是说,是否可以在“循环”中使用模板字符串的行为(用k值替换$ {k}),直到不再有$ {}替换结果字符串为止?
更好的解决方案是允许数据存储在地图中而不是当前上下文中。也就是说,从
开始data = { x : '===${y}===', y: '${y}', z='hi' }
通话:
myFunction(data, 'x')
应返回'=== hi ==='。
答案 0 :(得分:1)
可以使用eval
。
下面的代码显示了在全局上下文中完成此工作的方法。
x = '===${y}===';
y = '${z}';
z = 'hi';
template = x;
result = x;
do {
template = result;
result = eval("`"+template+"`");
} while(result != template);
result;
在非全局上下文中,可以将函数创建为字符串并传递给eval
函数。下面的代码显示了如何执行此操作。
let data = { x : '===${y}===', y: '${z}', z : 'hi' }
let myFunction = function(data, member) {
let env = ["(function() { \n"];
for(let prop in data){
env.push("\tlet ");
env.push(prop);
env.push(" = '");
env.push(data[prop]);
env.push("';\n");
}
let template = data[member]
let result = data[member];
do {
template = result;
env.push("\treturn `"+template+"`;\n");
env.push("})();");
result = eval(env.join(""));
env.pop();
env.pop();
} while(result!=template);
return result;
}
myFunction(data, "x");