JavaScript:函数与变量

时间:2019-01-07 14:16:17

标签: javascript

我正在尝试将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)

这是一个简单的华氏转摄氏度的功能。恐怕它会将变量视为字符串。但是接下来要讲的是,我希望将其视为一个函数。是否有解决方法来实现它。

谢谢

3 个答案:

答案 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的组成部分。

我的建议是检查是否:

  • 您的域可以用纯数据建模,如果是这种情况,请宾果游戏,将其存储并在JS中编写。
  • 您的域可以用DSL建模,查看其复杂性,并在需要时存储它的某种表示形式

并采取相应行动。

答案 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

谢谢大家