我有这样的模板“text %variable.key% text”。variable.key 是变量。我需要将这些变量重命名为“text”+variable.key+“text”,以使它们工作。
我试图做这样的事情:
var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
return eval('b');
});
但它也返回一个字符串。
有人可以告诉我该怎么做吗?
我有这样的模板“text %variable.key% text”。variable.key 是变量。我需要将这些变量重命名为“text”+variable.key+“text”,以使它们工作。
我试图做这样的事情:
var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
return eval('b');
});
但它也返回一个字符串。
有人可以告诉我该怎么做吗?
完全不使用很容易做到eval:
function getValue(path) {
var target = this;
path.split('.').forEach(function (branch) {
if (typeof target === "undefined") return;
target = (typeof target[branch] === "undefined") ? undefined : target[branch];
});
return target;
}
如果您想从window您开始获取属性,只需调用getValue("path.to.property"). 如果您想从其他一些根对象开始,请使用getValue.call(rootObject, "path.to.property").
该函数也可以适用于将根对象作为可选的第一个参数,但想法保持不变。
重要提示:这在 Internet Explorer < 9 上不起作用,因为Array.prototype.forEach它不存在。你可以用
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(fun /*, thisPointer */) {
var len = this.length;
if (typeof fun != "function") throw new TypeError();
var thisPointer = arguments[1];
for (var i = 0; i < len; i++) {
if (i in this) {
fun.call(thisPointer, this[i], i, this);
}
}
};
}
另一个没有 eval() 的变体适用于简单的变量或对象:
var var_name = 'value';
// object
var obj = new Object();
obj.prop = 'some val';
var tpl = "text %obj.prop% text %var_name% text";
tpl = tpl.replace(/%(.*?)%/gi, function(a,b) {
var iv = b.split('.');
return (iv.length == 2) ? window[iv[0]][iv[1]] : window[iv[0]];
});
// test
alert(tpl);
var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
return eval(b);// remove quote.
});
您的代码是正确的,但您需要 eval b,而不是'b':
var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
return eval(b);
});
正如评论中提到的,使用 eval 不是要走的路。您也可以像这样获得变量值:
var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
return window[b];
});