当前位置: 首页 > 面试题库 >

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

微生德运
2023-03-14
问题内容

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

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

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

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

这不可能是第一次。; /

谢谢你的帮助。


问题答案:

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

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

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

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

http://jsfiddle.net/kceTr/

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

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

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

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



 类似资料:
  • 问题内容: 我对如何做一些我认为很简单的事情感到困惑。我有一个使用编写的简单应用。看起来像这样: 我发现我的终端以其他Flask应用程序的其他调试代码输出了打印语句,但没有输出。如果我在app.run之前删除呼叫,则输出正常。此外,我发现启动时会重复输出两次,尽管我不知道这是不是很奇怪的输出,或者该函数实际上被调用了两次。 我假设这不是在调用之前添加函数调用的正确方法。我查看了Flask文档,发现

  • 如果接口只是一个标记接口,用于在 java 中传递有关类的某种元数据 - 我有点困惑: 在阅读了java的序列化算法(元数据从下到上,然后从上到下的实际实例数据)的过程之后,我无法真正理解哪些数据不能通过该算法进行处理。 简而言之: 哪些数据可能导致? 我怎么知道我不应该为我的类添加子句?

  • 我正在编写一个可序列化的类,它接受多个参数,包括一个函数: 存储在成员变量中,因此需要可序列化。如果分配给它们的类型是可序列化的,则Javalambda是可序列化的。如果使用lambda创建,那么确保在构造函数中传递的是可序列化的最佳方法是什么? > 创建一个可序列化函数,并使用该函数: 问题: 现在,

  • 问题内容: 我在一些帖子中看到人们在编写动态HTML时不喜欢在javascript中使用。 为什么是这样?什么是 正确的 方法是什么? 问题答案: 仅在最初解析页面和创建DOM时才起作用。浏览器到达结束标记并且DOM准备就绪后,就不能再使用了。 我不会说使用是正确的还是不正确的,这仅取决于您的情况。在某些情况下,您只需要完成任务即可。查看如何将Google Analytics(分析)注入大多数网站

  • 问题内容: 我正在尝试使用一个使用大量jQuery的Layout / Template的项目。 我已经学会了将模板与ReactJS Project集成在一起,但是,我正在寻找一种可以完全替代jQuery的解决方案。 我的解决方案之一是在内部使用jQuery函数或React函数。 这种方法正确吗?这是正确的方法吗? 我在下面附上一个小例子: 这是我的职能。 问题答案: 这种方法正确吗?这是正确的方法

  • 这就是我目前拥有所有实体类的方式(此处仅显示一个以供参考) 来自lombok参考: @Data注释可能是项目Lombok工具集中最常用的注释。它结合了@ToString、@EqualsAndHashCode、@Getter和@Setter的功能。本质上,在类上使用@数据与使用默认的@ToString和@EqualsAndHashCode注释该类以及使用@Getter和@Setter注释每个字段是一