如何像javaScript中的函数一样执行String?

时间:2014-01-22 16:40:59

标签: javascript jquery json

在JAVA中我生成一个像这样的字符串:

{
 "name":"ali",
 "lastName":"cate",
 "action":"function(event) {alert(this.name +'clicked');}"
}

我可以在javaScript中使用这个String非常简单,就像JSON对象一样,但是我无法执行action属性中描述的函数(在JS中),我遇到了这个错误:

 TypeError: Object function(event) {alert(this.name +'clicked');}
 has no method 'apply'

所以......有什么方法可以让它发挥作用吗?

编辑(更多信息)

问题是Json String是用Java生成的(带引号)。这就是一个例子,实际上真正的问题是使用高图饼图,这接收了事件属性中的函数,是谁试图运行它。

3 个答案:

答案 0 :(得分:4)

你可以在没有eval的情况下通过删除函数...

周围的引号来实现
var obj = {
 "name":"ali",
 "lastName":"cate",
 "action": function(event) {alert(this.name +'clicked');}
};

obj.action('');

请记住,如果您从真实事件中执行此操作,this将不会成为对象 - 例如,它将是单击的元素。

从设计角度来看,函数是否需要成为对象的一部分?

function objectClicked(obj) {
    alert(obj.name + ' clicked');
}

您可以将该功能拉出并在您自己的JavaScript中使用,然后传递一个更简单的对象:

{
 "name":"ali",
 "lastName":"cate"
};

如果您确实使用eval ...将函数包装在自执行匿名函数中,则将此eval结果赋给该操作,这将导致操作只是一个正常的函数从那以后......

var obj = {
   "name":"ali",
   "lastName":"cate",
   "action":"(function() { return function(event) {alert(this.name + ' clicked');} }())"
};

obj.action = eval(obj.action);

obj.action();

答案 1 :(得分:2)

发生此错误,因为action是字符串而不是函数。

你可以让它与eval一起使用,但这是不好的做法。

答案 2 :(得分:1)

'eval'会这样做:

var obj = { "action": "alert('test');" };
eval(obj.action);