Javascript Eval适用于函数和纯字符串

时间:2015-10-07 10:51:50

标签: javascript eval

我想显示一个项目列表,现在有时这些项目' 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);
}

3 个答案:

答案 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;
}