【发布时间】:2018-08-08 14:35:20
【问题描述】:
我的应用获取资源字符串 + 占位符标记的列表,它应该使用给定值更改标记。
此类资源的一个示例是:"http://example.com/?name=${name}&age=${age}";
(我在一个数组中有很多这样的东西,但这不相关)。
所以现在我有了这个^ 字符串并且我有了值。所以我需要生成消化后的字符串。
当然我可以使用eval:
var template = "http://example.com/?name=${name}&age=${age}";
var name = "John";
var age = "30";
var url = eval(`\`${template}\``);
console.log(url); //http://example.com/?name=John&age=30
这可行。但我不想使用eval。
所以我改用new Function()() 的其他方法:
var url = new Function ('tmpl','obj','return `${tmpl}`')
这产生了函数:
ƒ anonymous(tmpl,obj ) {
return `${tmpl}`
}
所以现在我可以做:
new Function ('tmpl','obj','return `${tmpl}`')(template ,{name, age})
但现在我需要在内部函数中拆分 obj 以便模板字面量知道值
顺便说一句 - 我试过了 - 没有成功:
(new Function ('tmpl','obj','return `${tmpl}`').bind({name,age})) (template)
问题
如何在内部函数中展平obj,以便${} 具有已知的本地值?
铌 我不喜欢使用正则表达式解决方案,因为模板文字中有换行符。此外,这些资源故意采用 es6 模板字符串的格式
【问题讨论】:
-
您仍然需要 eval 将字符串转换为模板。使用函数不会改变这一点。
-
@KevinB 函数返回一个模板 "return
${tmpl}" -
是的,但这不会满足您的要求。
-
您的功能甚至不起作用。它只是将
tmpl作为字符串返回。 -
您正在将模板文字用于它不打算用于的东西。这就是我们在 ES6 中仍然使用模板引擎的原因。
标签: javascript ecmascript-6 template-literals