繁体   English   中英

通过 AJAX 发送 js 函数

[英]Send js function through AJAX

我想将“一个 javascript 函数”传递给我的后端,并且我正在使用 ajax。 这是一个简短的例子:

var data = { 
    prop: function (e) { alert(e) }
};
ajax.(..., data: data, dataType: "json")...

这会自动从数据中删除prop ,因为它是一个函数。

如何使用 json 将此函数传递给我的后端? 无需将其转换为字符串。

你真的希望从客户端发送功能的服务器,并执行该功能的服务器上,并非没有很多的安全检查。 想一想,记住你不能相信从客户那里收到的任何东西。 另外,服务器应该已经知道如何做它需要做的事情; 通常你会做的是发送一个命令(一个字符串)告诉它使用那个函数(它已经有了,因此你可以信任)。

但是,如果你想继续这样做:

无需转换为字符串。

你不能。 唯一的方法是将函数作为源代码或可以通过 HTTP 发送的其他形式发送,HTTP 最终是基于文本的协议。 因此,您可以发送源代码,或者将其编译为您自己设计的某种字节码,然后发送(转换为字符串,可能是 Base64 或类似的字符串)等。

从 ES2015 开始,普通函数需要有一个采用有效函数声明或表达式形式的toString ,因此您可以发送该字符串:

var dataToSend = {prop: data.prop.toString()};
ajax(..., data: JSON.stringify(dataToSend), dataType: "json")

然后服务器必须编译该字符串并执行结果。 JavaScript 提供了一种方法来做到这一点( eval ),但同样:执行从客户端收到的代码是非常危险的。 做非常危险的事情需要先做很多安全检查。

当前的 JavaScript 版本,即 < ES2015 本身并不通过使用JSON.stringify()或类似的函数来支持这一点,尽管如果您使用 NPM 或其他模块包管理器,您可以安装一个包。

这个包叫做serialize-javascript ,它添加了一个serialize函数,你可以用它来将函数、正则表达式等转换为字符串表示。 然后您可以在服务器端使用eval

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM