我想显示一个项目列表,现在有时这些项目' title只是一个普通的字符串,有时它可能是一个函数返回的值。
如何使用eval()使两个事件都有效?
以下是一个示例代码:
var a1 = "formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')"
var a2 = "#america"
var result1 = eval(a1) // works well!
var result2 = eval(a2) // doesn't work, need to use eval('a2') but then first one doesn't work
我唯一能想到的就是在创建字符串时#34;#america"把它保存起来像#34;'#america'"相反,但我宁愿避免它
[编辑]
最终我会有这样的事情:
arr.push("formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')");
arr.push("#america");
for(var i = 0; i < arr.length; i++) {
var ev = eval(arr[i]);
console.log(ev);
}
答案 0 :(得分:1)
我建议将eval包装在try catch块中,如果eval成功则返回值,否则返回最初传递给function的值。在很多情况下,eval可能会失败,因为它只是试图将字符串解析为有效的JavaScript,因此任何无效的JS不仅仅是一个简单的字符串都会导致它失败,所以最好是安全并捕获它产生的任何错误。
var evaluate = function(value) {
try {
return eval(value);
}
catch(err)
{
return value;
}
}
答案 1 :(得分:1)
var ev = eval(a2)
等同于var ev = eval('#america')
,它没有任何实际意义。
当您说eval('a2')
有效时,我认为ev = '#america'
是理想的结果。 'a2'
表达式被评估为只是访问该名称变量的值。
你基本上只是拥有一系列字符串可能是有效的javascript代码,或者可能没有,并且没有办法分辨哪个是哪个。在这种情况下,你能做的最好就是
try {
ev = eval(arr[i]);
} catch(ex) {
ev = arr[i];
}
......显然看起来很可怕。你能控制arr
中的条目内容吗?
arr.push(function() {
return formatDate(startTime) - formatDate(endTime);
});
arr.push("#america");
在这种情况下,您可以检查每个条目的类型,并据此采取行动:
for(var i = 0; i < arr.length; i++) {
var ev = typeof arr[i] == 'function' ? arr[i]() : arr[i];
console.log(ev);
}
答案 2 :(得分:0)
这是我应该做的:
var a1 = function(){
return formatDate(startTime) + formatDate(endTime)
}
var a2 = "#america"
var result1 = a1();
var result2 = a2;
如果var是一个函数或一个对象或其他任何东西,Yo可以检查typeof(a1)。
if(typeof(a1)=='function'){
result = a1();
}else{
result=a1;
}