JavaScript:函数与变量

JavaScript:函数与变量,javascript,Javascript,我试图在数据库中存储JavaScript函数。数据库中的每一行都有不同的函数。根据调用的行,特定函数将在浏览器中执行 澄清一下:我并不是在服务器上执行这个函数。它将只存储在服务器上,并被提取到客户端,并将像任何其他javascript函数一样执行 首先,我的问题是,这可能吗。我一直在读javascript允许函数存储在变量中,所以我想为什么不存储在数据库中呢。这将使我可以根据行自由执行不同的函数 第二,我一直在犯这样的错误: >a=cell._cell.row.data.jsfunctio

我试图在数据库中存储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)
>a=cell.\u cell.row.data.jsfunction
“toCelsius函数(华氏度){
返回(5/9)*(华氏32度);
}"
>()
VM435:1未捕获类型错误:a不是函数
在评估时(在cellClick评估时)(empRead.html:14),:1:1)
在t.cellClick(empRead.html:21)
在w.edit(tablator.min.js:6)
在HTMLDEVELENT。(制表器min.js:6)
这是一个简单的华氏到摄氏的转换函数。恐怕它把一个变量当作字符串处理。但是如何告诉它,我想把它当作一个函数。是否有任何解决办法来实现这一目标


感谢

变量只是表示值的一种方法

JavaScript支持许多不同类型的值,包括数字、字符串、数组和函数

要在数据库中存储某些内容,必须将其表示为数据库能够理解的值类型。我不知道有任何数据库支持“JavaScript函数”作为数据类型

相反,您需要以数据库能够理解的格式存储数据的某种表示形式

例如,函数的源代码,您可以在客户端上对其进行
eval
(这似乎是您正在尝试的,但您忘记了
eval
部分)。这会打开一整罐蠕虫,一般不建议这样做

通常,最好的方法是将一组预定义函数作为客户端JS程序的一部分(可能组织为对象的属性),然后将标识符存储在数据库中(例如属性名称)

然后你可以这样做:

my_trusted_functions[cell._cell.row.data.jsfunction]();

变量只是表示值的一种方法

JavaScript支持许多不同类型的值,包括数字、字符串、数组和函数

要在数据库中存储某些内容,必须将其表示为数据库能够理解的值类型。我不知道有任何数据库支持“JavaScript函数”作为数据类型

相反,您需要以数据库能够理解的格式存储数据的某种表示形式

例如,函数的源代码,您可以在客户端上对其进行
eval
(这似乎是您正在尝试的,但您忘记了
eval
部分)。这会打开一整罐蠕虫,一般不建议这样做

通常,最好的方法是将一组预定义函数作为客户端JS程序的一部分(可能组织为对象的属性),然后将标识符存储在数据库中(例如属性名称)

然后你可以这样做:

my_trusted_functions[cell._cell.row.data.jsfunction]();

可能不是个好主意。为了正确地存储函数,您需要存储其整个声明上下文,这显然是不可取的(如果可能的话)。正如其他答案中所建议的那样,您可以为您的应用程序创建一个DSL,并将此DSL中表达式的表示形式存储到DB中,希望比JS AST简单得多

例如,如果应用程序的域正在处理温度数据,则可以使用一些通用函数,如
转换(从,到,值)
添加(值1,值2)
,这些函数很容易组合。存储
convert
函数的表示只是存储不同单元之间的匹配映射,
add
只是
convert
与加法的组合

我的建议是检查是否:

  • 您的域可以用纯数据建模,如果是这样的话,那么bingo,将其存储并用JS编写
  • 您的域可以使用DSL建模,查看它的复杂性,如果需要,还可以存储它的某种表示

并据此采取行动。

可能不是个好主意。为了正确地存储函数,您需要存储其整个声明上下文,这显然是不可取的(如果可能的话)。正如其他答案中所建议的那样,您可以为您的应用程序创建一个DSL,并将此DSL中表达式的表示形式存储到DB中,希望比JS AST简单得多

例如,如果应用程序的域正在处理温度数据,则可以使用一些通用函数,如
转换(从,到,值)
添加(值1,值2)
,这些函数很容易组合。存储
convert
函数的表示只是存储不同单元之间的匹配映射,
add
只是
convert
与加法的组合

我的建议是检查是否:

  • 您的域可以用纯数据建模,如果是这样的话,那么bingo,将其存储并用JS编写
  • 您的域可以使用DSL建模,查看它的复杂性,如果需要,还可以存储它的某种表示

并相应地采取行动。

是的,已经完成了。这篇文章提供了帮助:

我用user984003回答。非常感谢用户984003

以下是解决方案:

>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
>s=window.document.createElement(“脚本”);
>s、 innerHTML=cell.\u cell.row.data.jsfunction
“toCelsius()函数{
报税表(5/9)*(200-32);
}"
>window.document.body.appendChild
​函数toCelsius(){
报税表(5/9)*(200-32);
}​​
>托克尔修斯()
93.33333333333334