我正在尝试将JavaScript函数存储在数据库中。数据库中的每一行将具有不同的功能。根据调用的行,特定功能将在浏览器中执行。
一些澄清:我不是试图在服务器上执行该功能。它只会存储在服务器上并提取到客户端,并且会像其他任何JavaScript函数一样执行。
首先,我的问题是,这可能吗?我一直在阅读javascript允许将函数存储在变量中,所以我想为什么不将其存储在数据库中。这将使我能够自由地基于行执行其他功能。
第二,我一直收到此错误:
>a=cell._cell.row.data.jsfunction
"function toCelsius(fahrenheit) {
return (5/9) * (fahrenheit-32);
}"
>a()
VM435:1 Uncaught TypeError: a is not a function
at eval (eval at cellClick (empRead.html:14), <anonymous>:1:1)
at t.cellClick (empRead.html:21)
at w.edit (tabulator.min.js:6)
at HTMLDivElement.<anonymous> (tabulator.min.js:6)
这是一个简单的华氏转摄氏度的功能。恐怕它会将变量视为字符串。但是接下来要讲的是,我希望将其视为一个函数。是否有解决方法来实现它。
谢谢
答案 0 :(得分:4)
变量只是表示值的一种手段。
JavaScript支持许多不同种类的值,包括数字,字符串,数组和函数。
要将某些内容存储在数据库中,必须将其表示为数据库可以理解的一种值。我不知道任何支持“ JavaScript函数”作为数据类型的数据库。
相反,您需要以数据库可以理解的格式存储某种形式的数据表示形式。
例如,该函数的源代码,您可以随后在客户端上eval
(这似乎是您正在尝试的操作,但是您忘记了eval
部分)。这会打开一整罐蠕虫,通常不建议这样做。
通常,最好的方法是将一堆预定义函数作为客户端JS程序的一部分(可能组织为对象的属性),然后将标识符存储在数据库中(例如,属性名称)。 / p>
您可以这样:
my_trusted_functions[cell._cell.row.data.jsfunction]();
答案 1 :(得分:0)
可能不是一个好主意。为了正确地存储一个函数,您需要存储它的整个声明上下文,这显然是不希望的(如果可能的话)。正如其他答案中所建议的,您可以做的是为您的应用程序创建一个DSL,并将该DSL中的表达式表示形式存储到数据库中,希望比JS AST简单得多。
例如,如果您的应用程序所在的域正在处理温度数据,则可以轻松地编写一些通用功能,例如convert(from, to, value)
,add(value1, value2)
。存储convert
函数的表示形式只是存储不同单元之间的匹配图,add
只是convert
的组成部分。
我的建议是检查是否:
并采取相应行动。
答案 2 :(得分:0)
是的。帮助来自这篇文章:
Given a string describing a Javascript function, convert it to a Javascript function
我使用了user984003的答案。非常感谢user984003。
这是解决方案:
>s = window.document.createElement("script");
>s.innerHTML = cell._cell.row.data.jsfunction
"function toCelsius() {
return (5/9) * (200-32);
}"
>window.document.body.appendChild(s)
<script>function toCelsius() {
return (5/9) * (200-32);
}</script>
>toCelsius()
93.33333333333334
谢谢大家