一尘不染

什么是在JavaScript中“序列化”函数以供以后使用的正确方法

json

我有一个要从数据库动态加载的对象的“库”。每个对象都有其自己的特殊功能,这些功能在特定时间取决于对象类型而被调用。理想情况下,我希望能够做到这一点,尽管有人指出这行不通:

library = {
  "myObj" : {"name" : "myObj", "type" : "myType", "function" : function () { } } //, etc
}

字符串"myObj"在程序中传递了很多,但是我一次只需要访问对象的某些值,在某些情况下,需要运行特定的函数。问题在于,我正在研究数百个,最终是数千个具有不同功能的潜在对象。

这样存储函数的“正确”方法是什么?我知道在执行过程中调用eval可能非常不安全,从而启用xss攻击等等。我真的想避免大量的switch语句或其他功能的过分加载。我也希望解决方案尽可能简洁。

这不可能是第一次。; /

谢谢你的帮助。


阅读 186

收藏
2020-07-27

共1个答案

一尘不染

将其作为字符串加载后,只需使用eval重新创建该函数即可。因此,如果您myObj从JSON 反序列化对象,并且具有一个属性:

myObj = {
    ....
    function: "function() { ... }"
}

您可以很容易地将其转换为实函数:

eval("myObj.func = " + myObj.func);

http://jsfiddle.net/kceTr/

哦-我不确定这是否是编辑内容,还是我之前错过了它-但是请重新评估。

评估是一种工具。您想要将函数存储在数据库中。如果您必须“评估”以将其转换为代码,或者有其他魔术方法可以实现,那么这实际上并没有多大区别:如果有人可以更改数据库中的数据,那么他们可以更改函数。

如果您需要存储函数,那么eval是您的工具。它不是天生的“坏”,而是坏的,因为它很容易被滥用。是否使用得当取决于您。

请记住,客户端上运行的所有内容仍然只是在客户端上运行。恶意人员无法使用eval进行操作,他们无法更轻松地使用Chrome调试器进行操作。任何人都可以始终在客户端上运行他们想要的任何代码,这取决于您的服务器来决定如何处理收到的代码。首先,客户没有什么安全的…

2020-07-27